hosted by:
freehost386.com
 Reading

ASP Voice 1.0
Seminar: Komunikacija Človek Stroj

Avtorja:

Matevž Bohinc

Željko Jotanovič

Uvod

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

Bistvo omenjenega algoritma je pretvorba niza besed v izgovorjeno besedo. Proces se začne ko aplikaciji podamo naprimer besedo '' The man walked down 56th St.''. algoritem je sestavljen iz štirih modulov  in sicer ''text analysis'' sprejme številke ki jih spremeni v besede, identificira ločila, ter prepozna kako naglasiti akronime. Modul ''prosody'' določi s kako inenziteto galsnosti se besede izgovorijo, brez omenjene obdelavo, bi izgovorjen tekst bil precej monoton. Modul ''generate phonemes'' določi kako se besede naglasijo. To naredi s pomočjo slovarja ali algoritma ki ugiba naglaševanje. Modul ''signal processing'' poskrbi da se obdelna beseda pretvori v pravilen signal, to je izhod oziroma glas na zvočniku.

slika1

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.

slika2

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://en.wikipedia.org/wiki/Human-computer_interactionhttp://www.microsoft.com/msj/archive/s233.aspx
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