|
hosted by: freehost386.com |
ASP Voice 1.0
Seminar: Komunikacija Človek Stroj
Matevž Bohinc
Željko Jotanovič
V sedanjem času je komunikacija zelo pomebna. Komunikacija lahko poteka med
različnimi bitji in stroji (žival -
žival, človek – človek, človek – žival, stroj – človek....) ter podobne
kombinacije . Nas bo predvsem zanimala komunikacija med človekom in strojem
(obojestranska - dialog). Glavna
naloga te komunikacije je, da izboljša komunikacijo med uporabniki in stroji
tako, da naredi stroje bolj dojemljive in uporabne glede na potrebe
uporabnika. Mi se bomo omejili na področje prepoznavanje govora, kjer se
izgovorjene besede pretvorijo v razumljivo vhodno informacijo za obdelavo na
računalniku. Eno najbolj vidnih področij, ki uporablja prepoznavanje govora,
je medicina oz medicinska transkripcija (prepisovanje). Zaenkrat je največja
ovira pri prepoznavanju govora ravno programska oprema, druga ovira pa je
čas, ki je potreben da program naučimo.
Najbolj pogosta področja, ki uporabljajo prepoznavanje glasu, so prej
omenjena medicina, predvsem uporaba pri zapisovanju velike količine
dokumentacije. Naslednji velik uporabnik je vojska, kjer se je
implementacije prepoznavnje govora v letalih izkazala za učinkovito. Pilot
lahko nastavlja radio frekvenco, upravlja auto-pilot-a, nastavlja koordinate
letenja, ter operacije z orožjem in informacije o letalu. Uporaba v vojaških
upravljanjih (vojne razmere, na vojnih področjih), kjer je potrebno zelo
hitro dostopati do različnih baz podatkov, ki se zelo hitro spreminjajo,
uporaba glasu tako olajša oziroma vidni del polja razbremeni za drugo
uporabo. Zelo koristna uporaba se je tudi izkazala v treningu kontrole
letenja (tako civilno kot vojaško), kjer stroj simulira »pilota«, kot bi
bilo v realni situaciji. Telefonija in igričarsko področje je tudi pogost
uprabnik prepoznavanja govora, sedaj se pa tudi povečuje delež uporabnikov,
ki uporabljajo ASR (automatic speech recognition) pri ustvarjanju dokumentov
v domači uporabi. Nenazdanje uporabljajo ASR tudi ljudje s posebnimi
potrebami, še posebaj uporabno je za ljudi ki ne morejo uporabljati svojih
rok.
Trenutno se po svetu izvaja veliko raziskovalnih projektov na
omenjeno temo, samo razpoznavanje govora pa vidno prodira tudi v komercialna
področja, kajti čedalje več multimedijskih naprav uporablja ASR.
Opis projekta
Osnovna ideja najinega projekta je bila olajšana uporaba slovarja, ki bi bil
kot pripomoček pri vsakdanji uporabi dela z različnim tekstom (internet,
dokumenti...). Uporabnik lahko
s preprostimi glasovnimi ukazi poizve o neznani besedi v angleščini, lahko
izve tudi kako se beseda izgovori. Med izdelavo programa pa sva prišla na
idejo, da bi lahko uporabnik
tudi poizvedel o določeni besedi na internetu, namreč ko brska po slovarju
in se mu zdi kakšna beseda zanimiva, lahko s preprostimi glasovnimi ukazi
poizve o njej na internetu (danes največjem internenem iskalniku –
Google). Program
omogoča tudi uporabo enostavnih ukazov iz okolja ''Okna'', kot so ''prilepi'',
''kopiraj'' in ''tab''. Za omeneno verzijo je potrebno imeti SAPI (Speech
Application Programming Interface) knjižico, ki je vsaj verzije 5.1 in .NET
Framework 2.0.
Program sva izdelala v
programskem paketu Visual studio C# 2008 express edition z uporabo SAPI
verzije 5.3
Opis uporabljenih standardov (SAPI)
Text-to-Speech Engine

Speech Recognition Engine
Ko uporabnik govori v mikrofon, se zvočni signali pretvorijo s pomočjo
zvočne kartice v digitalno obliko s pomočjo kvantizacije in vzorčenja.
Vzorec zvoka je sprva s pomočjo ''freqency analysis'' modula pretvorjen v
bolj uporabno obliko. Uporabljene so matematične metode kot je Fourierjeva
transormacija. Pretvorjen avdio vzorec je potem razbit na foneme s pomočjo
''phoneme recognition module'', za prepoznavao fonemov ima na razpolago bazo
podatkov fonemov, tukaj pa je tudi v pomoč ''phoneme prediction'' modul, ki
pomga pri hitreješemu prepoznavanju, namreč znano je da se nekateri glasovi
ne morejo pojaviti skupaj oz jih ljudje ne moremo izgovoriti, zato je
razpoznavanje olajšano. Enkrat ko je beseda poplnoma prepoznana in so vse
ostale možne različice prepoznane bsede eliminirane, opravi še zadnji modul
''construct text'' pretvorbo v črke. Rezultat je prepoznana beseda v obliki
za računalniško obdelavo.

The Microsoft Speech API
Speech Application Programming Interface ali SAPI
je razvil Microsoft za prepoznavanje
govora, ter izgovorjavo besedila ki je v digitalni obliki. V najnovejših
Microsoftovih sistemih je SAPI že integriran v sam sistem, za starejše
sisteme pa si je potrebno naknadno naložiti. Sapi je v bistvu pogon, ki ga
lahko programerji uporabijo v svojih aplikacijah v OS Oknih za prepoznavanje
govora ali pa za izgovorjavo besedila. Sapi verzij je nstalo kar nekaj. Prva
je bila ustvarjena leta 1995, zadnja aktualna verzija pa je 5.3. Problem pri
verzijah je, če smo napisali program, ki uporablja starejšo verzijo, ne bomo
mogli preprosto zamenjati Sapi z novejšo verzijo, namreč po vsej verjetnosti
bo potrebno napisati nov program. V Sapi-ju imamo definirano cel nabor
ukazov oz funkcij, za lažje programiranje, ki pa so spodaj opisane.
Komponente SAPI
Komponente ki se uporabljajo za pretvorbe besedila v govor (API for
Text-to-Speech) so naslednje:
ISpVoice
– ko aplikacija ustvari objekt
ISpVoice,
potem je potrebno poklicati samo še funkcije
ISpVoice::Speak,
da se generira izhodni govor iz
izbranega besedila. S pomočjo
ISpVoice::SetRate,
ISpVoice::SetVolume
,
ISpVoice::SetVoice
lahko nastavimo hitrost glasu in vrsto (moški, ženski...), glasnost. Prej
omenjene lastnosti lahko programsko spreminjamo kar v realnem času.
Informacije o lastnostih v relanem času oz med govorom lahko dobimo s
funkcijo
ISpVoice::GetStatus.
Events: sapi komunicira z aplikacijo z standardnimi windows mehanizmi (windows messages). Events (dogodki) so ponavadi za sinhronizacijo izhodnega govora, naprimer če imamo 3d animacijo v kateri človek premika usta, bi bila sinhornizacija fonemov oz izvorjenih glasov z usti v 3D aplikaciji. Dogodke lahko kontroliramo z naslednjimi vmesniki ISpNotifySource, ISpNotifySink, ISpNotifyTranslator, ISpEventSink, ISpEventSource, in ISpNotifyCallback.
Lexicons: Omenjena komponenta lahko poskrbi za naglaševanja glasu,
uporabljeni vmesniki pa so
ISpContainerLexicon,
ISpLexicon
in
ISpPhoneConverter.
Resources: vire kot so glas, baza za naglaševanje in podobne datoteke, lahko
upravljamo z vmesniki kot so
ISpDataKey,
ISpRegDataKey,
ISpObjectTokenInit,
ISpObjectTokenCategory,
ISpObjectToken,
IEnumSpObjectTokens,
ISpObjectWithToken,
ISpResourceManager
in
ISpTask.
Audio: Z omenjeno komponento lahko nastavljam ozvok za različna področja kot
so naprimer telefonija ali pa določena strojna oprema, multimedija...
pomagamo si pa z naslednjimi vmesniki
ISpAudio,
ISpMMSysAudio,
ISpStream,
ISpStreamFormat,
ISpStreamFormatConverter).
Komponente ki se uporabljajo za prepoznavanje govora (API
for Speech Recognition) so naslednje:
ISpRecoContext
– je glavna komponenta za prepoznavanje govora. S pomočjo vmesnika
ISpRecognizer
lahko nastavimo način prepoznavanja oz pogon prepoznavnja. Glede na to
kakšen signal sprejemamo, moramo temu primerno nastaviti tudi avdio vhod -
ISpRecognizer::SetInput.
Events: tudi tukaj lahko nastavimo kaj se zgodi ob določenih dogodkih. To
naredimo s pomočjo
ISpEventSource::SetInterest,
kjer nastavimo na ketri dogodek naj nas sapi opozori. Najbolj pogost dogodek
na katerega nas mora opozoriti je SPEI_RECOGNITION, ki indicira na to da je
ISpRecognizer
prepoznal besedo.
Grammar (slovar): v aplikaciji ki jo pišemo, moramo tudi definirati oz
ustvariti, naložiti in
aktivirati
ISpRecoGrammar,
ki nam definira kak način izgovarjanja je potrebno prepoznati (narpimer
narek, komando...). Slovar ustavrimo z
ISpRecoContext::CreateGrammar
in naložimo z
ISpRecoGrammar::LoadDictation,
aktiviramo pa z
ISpRecoGrammar::SetDictationState
oz če imamo komande
ISpRecoGrammar::SetRuleState.
Ko besedo prepoznamo, bo rezultat bil shranjen v strukturi
ISpRecoResult,
na kar nas bo opomnil SAPI preko dogodkovnih vmesnikov. Slovar definiramo v
posebni obliki XML datoteke. V slovarju definiramo besede, ki jih nato
razponavalnik uporabi pri prepoznavanju. Načeloma se pri programih ki
uporabljajo le komande kot prepoznavanje govora omejimo, tako da v slovar
napišemo le ukaze ki pridejo v poštev, s tem optimiziramo prepoznavanje
govora.
S slovnico lahko definiramo torej razne ukaze kot so ''activate'', ''deactivate'', ''copy'', ''paste'', ''internet'', ''open dictionary'', ''next'', ''skip'', ''read'', ''terminate'' in podobni. Vsakemu ukazu v svoji aplikaciji lahko priredimo funckijo ali dogodek. V datoteki v zgornji vrstici določimo id prepoznavalnega jezika LANGID=”409” 409-pomeni ameriško angleščino, 809-britansko angleščino. Poln seznam kod jezikov, ki jih Microsoft pozna, najdete na strani http://msdn.microsoft.com/library/en-us/intl/nls_238z.asp. Primer kode za najin slovar je:
<?xml version="1.0" encoding="utf-8"?>
<GRAMMAR LANGID="409">
<DEFINE>
<ID NAME="RID_OpenDictionary" VAL="4"></ID>
<ID NAME="RID_Copy" VAL="100"></ID>
</DEFINE>
<RULE NAME="Copy" ID="RID_Copy" TOPLEVEL="ACTIVE">
<P>copy</P>
</RULE>
<RULE NAME="OpenDictionary" ID="RID_OpenDictionary" TOPLEVEL="ACTIVE">
<P>open dictionary</P>
</RULE>
</GRAMMAR>
Primer kode v c# (tts, sr)
API for Speech Recognition
// ustavrimo objekt RecoContext.
objRecoContext = new SpeechLib.SpSharedRecoContext();
// ustavrimo ročico za dogodke (eventhandler)
objRecoContext.Hypothesis += new _ISpeechRecoContextEvents_HypothesisEventHandler(Hypo_Event);
// ročico dogodka dodelimo k dogodku ob katerem
želimo, da nas SAPI opozori, da je beseda prepoznana
objRecoContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(Reco_Event);
//instance za objekt slovarja
grammar = objRecoContext.CreateGrammar(0);
//Activate the Menu Commands.
menuRule = grammar.Rules.Add"MenuCommands",SpeechRuleAttributes.SRATopLevel|
SpeechRuleAttributes.SRADynamic,1);
object PropValue = "";
menuRule.InitialState.AddWordTransition(null,"New"," ,SpeechGrammarWordType.SGLexical,"New",
1, ref PropValue, 1.0F );
menuRule.InitialState.AddWordTransition(null,"Open"," ",SpeechGrammarWordType.SGLexical,"Open",
2, ref PropValue, 1.0F );
//Commit the grammar rules for reco.
grammar.Rules.Commit();
grammar.CmdSetRuleState("MenuCommands", SpeechRuleState.SGDSActive);
API for Text-to-Speech
using System;
using SpeechLib;
namespace SystemMonitor.Notifiers
{
class SpeechNotifier :
NotifierBas
{
public SpeechNotifier()
{
_voice = new SpVoice();
//definiramo objekt Ipvoice
}
public override void Execute(string title, string message)
{
string text = "System monitor warning! " + title;
_voice.Speak(text, SpeechVoiceSpeakFlags.SVSFDefault);
//izgovorimo tekst
}
private SpVoice _voice;
}
}
Praktična uporaba Projekta
1.
Ko prvič poženemo program nas program vpraša kje imamo shranjen internetni
brskalnik in slovar.

2.
Program aktiviramo z besednim ukazom ''ACTIVATE'', nato označimo v
našem brskalniku besedo (lahko označimo besedo tudi v kakšnem drugem
dokumentu ali aplikaciji!) in rečemo ''COPY''. Prav tako lahko poljubno
uporabimo kaz ''PASTE'' in vstavimo besedo kamorkoli.


3.
Z ukazom ''Open Dictionary''
odpre aplikacija slovar in avtomatsko poišče v slovarju besedo, ki je
trenutno v odložišču. Program nam nato ponudi še opcijo da nam prebere
besedo, z ukazom ''READ'', v primeru, da ne vemo kako se beseda izgovori! Ko
imamo še zmeraj odprt slovar, lahko uporabimo ukaza ''SKIP'' in ''NEXT''.
Ukaz skip je namesto bližnjice na tipkovnici
tab in ukaz next je bližnjiza za
puščico dol. Z
omenjenima ukazoma se lahko sprehajamo glasovno po slovarju, če nam
prva izbira besede ni všeč.

4.
Program nam da na izbiro, da za besedo, ki smo jo skopirali v odložišče
poizvemo še na internetu. Če izgovorimo ukaz ''INTERNET'', nam bo program
odprl internetni brskalnik in avtomatsko poizvedel za skopirano besedo v
iskalniku Google.

5.
V samem programu lahko ves čas
vizualno spremljamo katera beseda je bila prepoznana in katera beseda je
trenutno v odložišču. Z ukazom ''DEACTIVATE'' deaktiviramo vse ukaze za delo
s slovarjem in brskalnikom, z ukazom ''TERMINATE'' pa ugasnemo program.
Nadaljni razvoj programa
Med razvojem programa sva se odločila, da bova program nadgradila v prihodnosti. Program naj bi bil zasnovan tako, da bo uporabnik lahko sam določil dogodke ob določenih glasovnih ukazih. Tako bi dinamično povezala glasovne ukaze ki jih določi lahko sam uporabnik s svojimi programi in seveda tudi bližnjicami na tipkovnici. Ideja je, da bi naprimer lahko uporabnik v kakšnem urejevalniku dokumentov glasovno lahko urejal tekst (naprimer ukaz: ležeče, krepko, poravnava) in podobni primeri v kakšnih drugih programih. Glede na to, da lahko katerikoli tipki in bližnjici na na tipkovnici lahko določimo glasovni ukaz, smo precej neomejeni glede personalizacije takega programa.
Zaključek
Razpoznavanje govora je tehnologija, ki bo čedalje bolj prisotna v našem okolju. Bo pa potrebno paziti na nekatere težave. Med izdelavo sva imela težave z zajemanjem zvoka iz okolja, namreč če je bilo okolje hrupno, je program težko razpoznal besedo. Seveda je omenjen problem povezan tudi s strojno opremo. S kvalitetno strojno opremo za zajemanje zvoka se lahko izognemo marsikateri težavi.
Viri:
http://en.wikipedia.org/wiki/Speech_recognition
http://dn.codegear.com/article/29580
http://en.wikipedia.org/wiki/Speech_Application_Programming_Interface
Microsoft Speech SDK SAPI 5.1 (help)
| chat386.com :: mail386.com :: games386.com :: afnegunca.com :: start386.com :: si386.com |