Puheentunnistusohjelmat. Erittäin nopea puheentunnistus ilman palvelimia todellisen esimerkin avulla

Ihminen on aina kiinnostanut ajatus koneen ohjaamisesta luonnollisella kielellä. Ehkä tämä johtuu osittain ihmisen halusta olla koneen yläpuolella. Niin sanotusti tuntea itsensä paremmaksi. Mutta tärkein viesti on yksinkertaistaa ihmisen vuorovaikutusta tekoälyn kanssa. Ääniohjausta Linuxissa on toteutettu vaihtelevalla menestyksellä lähes neljännesvuosisadan ajan. Tarkastellaan asiaa ja yritetään päästä mahdollisimman lähelle käyttöjärjestelmäämme.

Asian ydin

Ihmisäänellä työskenteleviä järjestelmiä Linuxille on ollut olemassa jo pitkään, ja niitä on monia. Mutta kaikki eivät käsittele venäjän puhetta oikein. Kehittäjät hylkäsivät osan kokonaan. Katsauksen ensimmäisessä osassa puhumme suoraan puheentunnistusjärjestelmistä ja puheavustajista, ja toisessa tarkastelemme konkreettisia esimerkkejä niiden käytöstä Linux-työpöydällä.

On tarpeen erottaa toisistaan ​​itse puheentunnistusjärjestelmät (puheen kääntäminen tekstiksi tai komennoiksi), kuten esimerkiksi CMU Sphinx, Julius, sekä näihin kahteen moottoriin perustuvat sovellukset ja ääniavustajat, joista on tullut suosittuja. älypuhelimien ja tablettien kehityksen myötä. Tämä on pikemminkin sivutuote puheentunnistusjärjestelmistä, niiden jatkokehityksestä ja kaikkien onnistuneiden puheentunnistusideoiden toteuttamisesta, niiden soveltamisesta käytännössä. Näitä on vielä vähän Linux-pöytäkoneille.

Sinun on ymmärrettävä, että puheentunnistusmoottori ja sen käyttöliittymä ovat kaksi eri asiaa. Tämä on Linux-arkkitehtuurin perusperiaate - monimutkaisen mekanismin jakaminen yksinkertaisempiin komponentteihin. Vaikein työ jää moottoreiden harteille. Tämä on yleensä tylsä ​​konsoliohjelma, jota käyttäjä ei huomaa. Käyttäjä on vuorovaikutuksessa pääasiassa käyttöliittymäohjelman kanssa. Käyttöliittymän luominen ei ole vaikeaa, joten kehittäjät keskittyvät pääasiassa avoimen lähdekoodin puheentunnistuskoneiden kehittämiseen.

Mitä tapahtui ennen

Historiallisesti kaikki puheenkäsittelyjärjestelmät Linuxissa kehittyivät hitaasti ja harppauksin. Syynä ei ole kehittäjien kiero, vaan korkea taso kehitysympäristöön. Järjestelmäkoodin kirjoittaminen äänen kanssa työskentelemistä varten vaatii erittäin pätevän ohjelmoijan. Siksi ennen kuin alat ymmärtää puhejärjestelmiä Linuxissa, on tarpeen tehdä lyhyt retki historiaan. IBM:llä oli kerran niin upea käyttöjärjestelmä - OS/2 Warp (Merlin). Se ilmestyi syyskuussa vuonna 1996. Sen lisäksi, että sillä oli ilmeisiä etuja kaikkiin muihin käyttöjärjestelmiin verrattuna, OS/2 oli varustettu erittäin edistyneellä puheentunnistusjärjestelmällä - IBM ViaVoice. Tuohon aikaan tämä oli erittäin siistiä, kun otetaan huomioon, että käyttöjärjestelmä toimi järjestelmissä, joissa oli 486-prosessori ja 8 Mt RAM-muistia (!).

Kuten tiedät, OS/2 hävisi taistelun Windowsille, mutta monet sen komponentit säilyivät itsenäisinä. Yksi näistä komponenteista oli sama IBM ViaVoice, josta tuli itsenäinen tuote. Koska IBM aina rakasti Linuxia, ViaVoice siirrettiin tälle käyttöjärjestelmälle, mikä antoi Linus Torvaldsin idean aikansa edistyneimmän puheentunnistusjärjestelmän.

Valitettavasti ViaVoicen kohtalo ei sujunut niin kuin Linux-käyttäjät olisivat toivoneet. Itse moottori jaettiin ilmaiseksi, mutta sen lähteet pysyivät suljettuina. Vuonna 2003 IBM myi teknologian oikeudet kanadalais-amerikkalaiselle Nuance-yhtiölle. Nuance, joka kehitti ehkä menestyneimmän kaupallisen puheentunnistustuotteen - Dragon Naturally Speekingin, on edelleen elossa. Tämä on melkein loppu ViaVoicen kunniattomalle historialle Linuxissa. Sen lyhyen ajan kuluessa, jolloin ViaVoice oli ilmainen ja Linux-käyttäjien saatavilla, sille kehitettiin useita käyttöliittymiä, kuten Xvoice. Hanke on kuitenkin hylätty pitkään ja on nyt käytännössä käyttökelvoton.

TIEDOT

Konepuheentunnistuksen vaikein osa on ihmisen luonnollinen kieli.

Mitä tänään?

Nykyään kaikki on paljon paremmin. Viime vuosina, Google Voice API -lähteiden löytämisen jälkeen, puheentunnistusjärjestelmien kehitys Linuxissa on parantunut merkittävästi ja tunnistuksen laatu on parantunut. Esimerkiksi Google Voice API:hen perustuva Linux Speech Recognition -projekti näyttää erittäin hyviä tuloksia venäjän kielellä. Kaikki moottorit toimivat suunnilleen samalla tavalla: ensin käyttäjän laitteen mikrofonista tuleva ääni tulee tunnistusjärjestelmään, minkä jälkeen joko ääni käsitellään paikallisessa laitteessa tai tallenne lähetetään etäpalvelimelle jatkokäsittelyä varten. Toinen vaihtoehto sopii paremmin älypuhelimille tai tableteille. Itse asiassa kaupalliset moottorit toimivat juuri näin - Siri, Google Now ja Cortana.

Monista ihmisäänen kanssa työskentelevistä moottoreista on useita, jotka ovat tällä hetkellä aktiivisia.

VAROITUS

Monien kuvattujen puheentunnistusjärjestelmien asentaminen on ei-triviaali tehtävä!

CMU Sfinksi

Suuri osa CMU Sphinxin kehittämisestä tapahtuu Carnegie Mellonin yliopistossa. Eri aikoina sekä Massachusetts Institute of Technology että nyt edesmennyt Sun Microsystems -yhtiö työskentelivät projektin parissa. Moottorilähteitä jaetaan BSD-lisenssillä ja ne ovat saatavilla sekä kaupalliseen että ei-kaupalliseen käyttöön. Sphinx ei ole mukautettu sovellus, vaan joukko työkaluja, joita voidaan käyttää loppukäyttäjien sovellusten kehittämiseen. Sphinx on nyt suurin puheentunnistusprojekti. Se koostuu useista osista:

  • Pocketsphinx on pieni, nopea ohjelma, joka käsittelee ääntä, akustisia malleja, kielioppeja ja sanakirjoja;
  • Sphinxbase-kirjasto, tarvitaan Pocketsphinxin toimintaan;
  • Sphinx4 - todellinen tunnistuskirjasto;
  • Sphinxtrain on ohjelma akustisten mallien (ihmisen äänitallenteiden) harjoittamiseen.

Projekti etenee hitaasti mutta varmasti. Ja mikä tärkeintä, sitä voidaan käyttää käytännössä. Eikä vain tietokoneilla, vaan myös mobiililaitteilla. Lisäksi moottori toimii erittäin hyvin venäjän puheen kanssa. Jos sinulla on suorat kädet ja selkeä pää, voit määrittää venäläisen puheentunnistuksen Sphinxillä ohjaamaan kodinkoneita tai älykästä kotia. Tavallisesta asunnosta voi itse asiassa tehdä älykodin, minkä teemme tämän katsauksen toisessa osassa. Sphinx-toteutuksia on saatavana Androidille, iOS:lle ja jopa Windows Phonelle. Toisin kuin pilvimenetelmä, kun puheentunnistuksen työ jää Google ASR- tai Yandex SpeechKit -palvelimien harteille, Sphinx toimii tarkemmin, nopeammin ja halvemmalla. Ja täysin paikallinen. Halutessasi voit opettaa Sphinxille venäjän kielen mallin ja käyttäjien kyselyiden kieliopin. Kyllä, sinun on työskenneltävä vähän asennuksen aikana. Aivan kuten Sphinx-äänimallien ja -kirjastojen asettaminen ei ole aloittelijoille tarkoitettua toimintaa. Koska CMU Sphinxin ydin, Sphinx4-kirjasto, on kirjoitettu Java-kielellä, voit sisällyttää sen koodin puheentunnistussovelluksiin. Tarkat käyttöesimerkit kuvataan katsauksen toisessa osassa.

VoxForge

Erityisesti korostetaan puhekorpuksen käsitettä. Puhekorpus on jäsennelty joukko puhefragmentteja, jotka on varustettu ohjelmistolla, jolla pääset käsiksi korpuksen yksittäisiin elementteihin. Toisin sanoen se on joukko ihmisääniä eri kielillä. Ilman puhekorpusta mikään puheentunnistusjärjestelmä ei voi toimia. Laadukkaan avoimen puhekorpuksen luominen yksin tai pienelläkin porukalla on vaikeaa, joten erityinen projekti kerää ihmisäänitallenteita - VoxForge.

Jokainen, jolla on Internet-yhteys, voi osallistua puhekorpuksen luomiseen yksinkertaisesti tallentamalla ja lähettämällä puheen katkelman. Tämä voidaan tehdä jopa puhelimitse, mutta verkkosivuston käyttö on kätevämpää. Tietysti puhekorpuksessa tulee olla itse äänitallenteen lisäksi lisätietoa, kuten foneettinen transkriptio. Ilman tätä puheen tallennus on merkityksetöntä tunnistusjärjestelmälle.


HTK, Julius ja Simon

HTK - Hidden Markov Model Toolkit on työkalupakki puheentunnistustyökalujen tutkimukseen ja kehittämiseen piilotettuja Markov-malleja käyttäen, ja se on kehitetty Cambridgen yliopistossa Microsoftin suojeluksessa (Microsoft osti kerran tämän koodin kaupalliselta yritykseltä Entropic Cambridge Research Laboratory Ltd, ja sitten palautti sen Cambridgeen yhdessä rajoittavan lisenssin kanssa). Hankkeen lähteet ovat kaikkien saatavilla, mutta HTK-koodin käyttö loppukäyttäjille tarkoitetuissa tuotteissa on lisenssillä kielletty.

Tämä ei kuitenkaan tarkoita, että HTK olisi hyödytön Linux-kehittäjille: sitä voidaan käyttää apuvälineenä kehitettäessä avoimen lähdekoodin (ja kaupallisia) puheentunnistustyökaluja, kuten avoimen lähdekoodin Julius-moottorin kehittäjät, jotka ovat kehitetään Japanissa, tee. Julius toimii parhaiten japanin kanssa. Suuri ja voimakas ei myöskään ole riistetty, koska samaa VoxForgea käytetään äänitietokantana.

Jatko on vain tilaajien saatavilla

Vaihtoehto 1. Tilaa Hacker lukeaksesi kaiken sivuston materiaalin

Tilauksen avulla voit lukea KAIKKI maksulliset materiaalit sivustolla määritetyn ajan kuluessa.

Hyväksymme maksut pankkikorteilla, sähköisellä rahalla ja siirrot matkapuhelinoperaattoritililtä.

”Haluan sanoa heti, että tämä on ensimmäinen kerta, kun olen tekemisissä tunnistuspalveluiden kanssa. Ja siksi kerron sinulle palveluista maallikon näkökulmasta, asiantuntijamme totesi, "käytin tunnistamisen testaamiseen kolmea ohjetta: Google, Yandex ja Azure."

Google

Tunnettu IT-yritys tarjoaa Google Cloud Platform -tuotteensa testaamista verkossa. Kuka tahansa voi kokeilla palvelua ilmaiseksi. Itse tuote on kätevä ja helppokäyttöinen.

  • Plussat:
  • tuki yli 80 kielelle;
  • nopea nimenkäsittely;

korkealaatuinen tunnistus huonon viestinnän olosuhteissa ja vieraiden äänien läsnä ollessa.:

  • Miinukset
  • on vaikeuksia tunnistaa viestejä, joissa on aksentti ja huono ääntäminen, mikä tekee järjestelmän käytöstä vaikeaa kenenkään muun kuin äidinkielenään puhuvien;

selkeän teknisen tuen puute palvelulle.

Yandex

  • Yandexin puheentunnistus on saatavana useilla vaihtoehdoilla:
  • Pilvi
  • Kirjasto mobiilisovellusten kautta käytettäväksi
  • "laatikollinen" versio

JavaScript API

Tunnettu IT-yritys tarjoaa Google Cloud Platform -tuotteensa testaamista verkossa. Kuka tahansa voi kokeilla palvelua ilmaiseksi. Itse tuote on kätevä ja helppokäyttöinen.

  • helppokäyttöisyys ja konfigurointi;
  • hyvä tekstintunnistus venäjäksi;
  • järjestelmä tarjoaa useita vastausvaihtoehtoja ja yrittää hermoverkkojen kautta löytää vaihtoehdon, joka vastaa eniten totuutta.

Miinukset:

  • Virrankäsittelyn aikana jotkut sanat voivat olla määritetty väärin.

Taivaansininen

Azure on Microsoftin kehittämä. Se erottuu analogeistaan ​​hinnan ansiosta. Ole kuitenkin valmis kohtaamaan joitain vaikeuksia. Virallisilla verkkosivuilla esitetyt ohjeet ovat joko puutteellisia tai vanhentuneita. Emme pystyneet käynnistämään palvelua riittävästi, joten jouduimme käyttämään kolmannen osapuolen käynnistysikkunaa. Kuitenkin myös täällä tarvitset Azure-palveluavaimen testausta varten.

Tunnettu IT-yritys tarjoaa Google Cloud Platform -tuotteensa testaamista verkossa. Kuka tahansa voi kokeilla palvelua ilmaiseksi. Itse tuote on kätevä ja helppokäyttöinen.

  • Muihin palveluihin verrattuna Azure käsittelee viestit erittäin nopeasti reaaliajassa.

Miinukset:

  • järjestelmä on erittäin herkkä aksentille ja sillä on vaikeuksia tunnistaa muiden kuin äidinkielenään puhuvien puhetta;
  • Järjestelmä toimii vain englanniksi.

Tarkista tulokset:

Punnitsimme kaikki edut ja haitat, päädyimme Yandexiin. SpeechKit on kalliimpi kuin Azure, mutta halvempi kuin Google Cloud Platform. Googlen ohjelman tunnistuksen laatu ja tarkkuus on parantunut jatkuvasti. Palvelu parantaa itseään koneoppimistekniikoiden avulla. Kuitenkin Yandex tunnistaa venäjän sanat ja ilmaukset on korkeampi.

Kuinka käyttää puheentunnistusta liiketoiminnassa?

Tunnustuksen käyttämiseen on monia vaihtoehtoja, mutta keskitämme huomiosi siihen, joka vaikuttaa ensisijaisesti yrityksesi myyntiin. Selvyyden vuoksi tarkastellaan tunnistusprosessia todellisen esimerkin avulla.

Ei niin kauan sitten asiakkaaksemme tuli yksi tunnettu SaaS-palvelu (yrityksen pyynnöstä palvelun nimeä ei julkistettu). F1Golosin avulla he tallensivat kaksi äänivideota, joista toinen oli tarkoitettu lämpimien asiakkaiden iän pidentämiseen, toinen - asiakkaiden pyyntöjen käsittelyyn.

Kuinka pidentää asiakkaan elämää puheentunnistuksen avulla?

Usein SaaS-palvelut toimivat kuukausimaksulla. Ennemmin tai myöhemmin kokeilukäyttö tai maksullinen liikenne päättyy. Silloin palvelua on laajennettava. Yhtiö päätti varoittaa käyttäjiä liikenteen päättymisestä 2 päivää ennen käyttöajan päättymistä. Käyttäjille on ilmoitettu puhepostilla. Video kuulosti tältä: "Hyvää iltapäivää, muistutamme, että maksujaksosi XXX-palvelun käytöstä on päättymässä. Jos haluat laajentaa palvelua, sano kyllä, jos haluat peruuttaa tarjotut palvelut, sano ei.

Puhelut käyttäjiltä, ​​jotka sanoivat koodisanat: KYLLÄ, UUSI, HALUAN, LISÄÄ TIEDOT; siirtyivät automaattisesti yhtiön operaattoreille. Näin ollen noin 18 % käyttäjistä uusisi rekisteröintinsä vain yhden puhelun ansiosta.

Kuinka yksinkertaistaa tiedonkäsittelyjärjestelmää puheentunnistuksen avulla?

Toinen saman yrityksen lanseeraama äänileike oli luonteeltaan erilainen. He käyttivät ääniviestejä vähentääkseen puhelinnumeroiden vahvistamisesta aiheutuvia kustannuksia. Aiemmin he vahvistivat käyttäjänumerot robottipuhelun avulla. Robotti pyysi käyttäjiä painamaan tiettyjä puhelimen näppäimiä. Tunnistustekniikoiden myötä yritys kuitenkin muutti taktiikkaa. Uuden videon teksti oli seuraava: ”Olet rekisteröitynyt XXX-portaaliin, jos vahvistat rekisteröitymisesi, sano kyllä. Jos et lähettänyt rekisteröintipyyntöä, sano ei." Jos asiakas lausui sanat: KYLLÄ, VAHVISTAN, AHA tai TIETTY, tiedot tästä siirtyivät välittömästi yrityksen CRM-järjestelmään. Ja rekisteröintipyyntö vahvistettiin automaattisesti muutamassa minuutissa. Tunnistustekniikoiden käyttöönotto on lyhentänyt yhden puhelun kestoa 30 sekunnista 17 sekuntiin. Näin yritys alensi kustannuksia lähes 2 kertaa.

Jos olet kiinnostunut muista tavoista käyttää puheentunnistusta tai haluat lisätietoja ääniviesteistä, seuraa linkkiä. F1Golosissa voit tilata ensimmäisen uutiskirjeesi ilmaiseksi ja oppia itse, miten uudet tunnistusteknologiat toimivat.

) käyttämällä todellista Hello World -esimerkkiä kodinkoneiden ohjauksesta.
Miksi kodinkoneet? Kyllä, koska tällaisen esimerkin ansiosta voit arvostaa sitä nopeus ja tarkkuus joka voidaan saavuttaa käyttämällä täysin paikallinen puheentunnistus ilman palvelimia, kuten Google ASR tai Yandex SpeechKit.
Liitän artikkeliin myös kaiken ohjelman lähdekoodin ja itse kokoonpanon Androidille.

Miksi yhtäkkiä?

Olen äskettäin törmännyt kohtaan , ja kysyin kirjoittajalta, miksi hän halusi käyttää palvelinpohjaista puheentunnistusta ohjelmassaan (mielestäni tämä oli tarpeetonta ja johti joihinkin ongelmiin). Mihin sain vastakysymyksen, voisinko kuvailla tarkemmin vaihtoehtoisten menetelmien käyttöä projekteissa, joissa ei tarvitse tunnistaa mitään ja sanakirja koostuu rajallisesta sanajoukosta. Ja vaikka esimerkillä käytännön soveltamisesta...

Miksi tarvitsemme muuta kuin Yandexin ja Googlen?

Tätä "käytännöllistä sovellusta" varten valitsin aiheen ääniohjaus älykotiin.
Miksi juuri tämä esimerkki? Koska se näyttää useita täysin paikallisen puheentunnistuksen etuja pilviratkaisujen tunnistamiseen verrattuna. Nimittäin:
  • Nopeus- emme ole riippuvaisia ​​palvelimista emmekä siksi niiden saatavuudesta, kaistanleveydestä jne. tekijät
  • Tarkkuus- moottorimme toimii vain sovellustamme kiinnostavan sanakirjan kanssa, mikä parantaa tunnistuksen laatua
  • Hinta- Meidän ei tarvitse maksaa jokaisesta pyynnöstä palvelimelle
  • Ääniaktivointi- lisäbonuksena ensimmäisiin pisteisiin - voimme jatkuvasti "kuunella lähetystä" hukkaamatta liikennettämme ja lataamatta palvelimia

Huom

Haluan tehdä varauksen heti, että näitä etuja voidaan pitää etuina vain tietyn luokan projekteille missä olemme tiedämme varmasti etukäteen, mikä sanakirja ja millä kielioppilla käyttäjä toimii. Eli kun meidän ei tarvitse tunnistaa mielivaltaista tekstiä (esimerkiksi tekstiviestiä tai hakukyselyä). Muuten pilvitunnistus on välttämätön.

Joten Android voi tunnistaa puheen ilman Internetiä!
Kyllä, kyllä... Vain JellyBeanissa. Ja vain puolen metrin päästä, ei enempää. Ja tämä tunnistus on sama sanelu, vain paljon pienemmällä mallilla. Emme siis myöskään voi hallita tai määrittää sitä. Ja mitä hän palaa meille ensi kerralla, ei tiedetä. Vaikka juuri sopiva tekstiviestille!

Mitä aiomme tehdä?

Toteutamme kodinkoneiden äänikaukosäätimen, joka toimii tarkasti ja nopeasti, muutamalta metriltä ja jopa halvoilla, surkeilla, erittäin edullisilla Android-älypuhelimilla, tableteilla ja kelloilla.
Logiikka on yksinkertainen, mutta hyvin käytännöllinen. Aktivoimme mikrofonin ja sanomme yhden tai useamman laitteen nimen. Sovellus tunnistaa ne ja kytkee ne päälle ja pois nykyisestä tilasta riippuen. Tai hän saa heiltä omaisuuden ja lausuu sen miellyttävällä naisäänellä. Esimerkiksi huoneen nykyinen lämpötila.

Käytännön sovelluksia riittää

Aamulla, avaamatta silmiäsi, löi kämmenelläsi yöpöydällä olevaa älypuhelimen näyttöä ja käski "Hyvää huomenta!" - käsikirjoitus käynnistyy, kahvinkeitin käynnistyy ja humina, miellyttävä musiikki soi, verhot avautuvat.
Riputetaan halpa (2 tuhatta, ei enempää) älypuhelin seinälle jokaiseen huoneeseen. Menemme kotiin töiden jälkeen ja käskemme tyhjyyteen "Älykäs koti! Valot, TV! – En usko, että tarvitsee sanoa, mitä seuraavaksi tapahtuu.

Transkriptiot



Kielioppi kuvaa mitä mitä käyttäjä voi sanoa. Pocketsfinksin tiedoksi, Miten Hän lausuu sen, jokaisen kieliopin sanan on kirjoitettava, miltä se kuulostaa vastaavassa kielimallissa. Se on transkriptio jokainen sana. Sitä kutsutaan sanakirja.

Transkriptiot kuvataan käyttämällä erityistä syntaksia. Esimerkiksi:
smart uu m n ay j house d oo m

Periaatteessa ei mitään monimutkaista. Kaksoisvokaali transkriptiossa osoittaa stressiä. Kaksoiskonsonantti on pehmeä konsonantti, jota seuraa vokaali. Kaikki mahdolliset yhdistelmät kaikille venäjän kielen äänille.

On selvää, että emme voi kuvata etukäteen kaikkia transkriptioita sovelluksessamme, koska emme tiedä etukäteen, mitä nimiä käyttäjä antaa laitteilleen. Siksi luomme tällaisia ​​transkriptioita "lennossa" joidenkin venäläisen fonetiikan sääntöjen mukaisesti. Tätä varten voit toteuttaa seuraavan PhonMapper-luokan, joka voi vastaanottaa syötteenä merkkijonon ja luoda sille oikean transkription.

Ääniaktivointi

Tämä on puheentunnistusmoottorin kyky "kuunnella lähetystä" koko ajan reagoidakseen ennalta määrättyyn lauseeseen (tai lauseisiin). Samalla kaikki muut äänet ja puhe hylätään. Tämä ei ole sama asia kuin kieliopin kuvaileminen ja vain mikrofonin kytkeminen päälle. En esitä tässä tämän tehtävän teoriaa ja sen toiminnan mekaniikkaa. Haluan vain sanoa, että äskettäin Pocketsphinxin parissa työskentelevät ohjelmoijat ottivat käyttöön tällaisen toiminnon, ja nyt se on saatavana heti käyttöliittymässä.

Yksi asia on ehdottomasti mainitsemisen arvoinen. Aktivointilauseketta varten sinun ei tarvitse vain määrittää transkriptio, vaan myös valita sopiva herkkyyden kynnysarvo. Liian pieni arvo johtaa useisiin vääriin positiivisiin tuloksiin (tämä on silloin, kun et sanonut aktivointilauseketta, mutta järjestelmä tunnistaa sen). Ja liian korkea - immuniteetille. Siksi tämä asetus on erityisen tärkeä. Likimääräinen arvoalue - 1e-1 - 1e-40 aktivointilauseesta riippuen.

Läheisyysanturin aktivointi

Tämä tehtävä on projektikohtainen, eikä se liity suoraan tunnustamiseen. Koodi näkyy suoraan päätoiminnossa.
Hän toteuttaa SensorEventListener ja lähestymishetkellä (anturin arvo on pienempi kuin maksimi) kytkee ajastimen päälle, tarkastaen tietyn viiveen jälkeen, onko anturi edelleen tukossa. Tämä tehdään väärien positiivisten tulosten poistamiseksi.
Kun anturia ei enää tukossa, lopetamme tunnistamisen ja saamme tuloksen (katso kuvaus alla).

Aloitetaan tunnustaminen

Pocketsphinx tarjoaa kätevän API:n tunnistusprosessin määrittämiseen ja suorittamiseen. Nämä ovat luokat SpechRecognizer Ja SpeechRecognizerSetup.
Tunnistuksen konfigurointi ja käynnistäminen näyttää tältä:

PhonMapper phonMapper = uusi PhonMapper(getAssets().open("dict/ru/hotwords")); Kielioppi kielioppi = new Grammar(names, phonMapper); kielioppi.addWords(hotword); DataFiles dataFiles = new DataFiles(getPackageName(), "ru"); Tiedosto hmmDir = uusi Tiedosto(dataFiles.getHmm()); Tiedoston dict = uusi Tiedosto(dataFiles.getDict()); Tiedosto jsgf = uusi Tiedosto(dataFiles.getJsgf()); copyAssets(hmmDir); saveFile(jsgf, grammar.getJsgf()); saveFile(dict, grammar.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, hotword); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

Täällä kopioimme ensin kaikki tarvittavat tiedostot levylle (Pocketpshinx vaatii akustisen mallin, kieliopin ja sanakirjan transkriptioineen levyllä). Sitten itse tunnistusmoottori konfiguroidaan. Polut malli- ja sanakirjatiedostoihin on ilmoitettu sekä jotkin parametrit (aktivointilauseen herkkyyskynnys). Seuraavaksi konfiguroidaan polku kieliopin sisältävään tiedostoon sekä aktivointilause.

Kuten tästä koodista näet, yksi moottori on määritetty sekä kieliopin että aktivointilauseiden tunnistamiseen. Miksi tämä tehdään? Jotta voimme nopeasti vaihtaa sen välillä, mitä meidän on tällä hetkellä tunnistettava. Aktivointilauseen tunnistusprosessin aloittaminen näyttää tältä:

MRecognizer.startListening(KWS_SEARCH);
Ja näin puhe tunnistetaan tietyn kieliopin mukaan:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Toinen argumentti (valinnainen) on millisekuntien määrä, jonka jälkeen tunnistus päättyy automaattisesti, jos kukaan ei sano mitään.
Kuten näet, voit käyttää vain yhtä moottoria molempien ongelmien ratkaisemiseen.

Kuinka saada tunnustustulos

Tunnistustuloksen saamiseksi sinun on myös määritettävä tapahtuman kuuntelija, joka toteuttaa käyttöliittymän RecognitionListener.
Siinä on useita menetelmiä, joita pocketsphinx kutsuu, kun jokin tapahtumista tapahtuu:
  • onBeginningOfSpeech- moottori kuuli ääntä, ehkä se oli puhetta (tai ehkä ei)
  • onEndOfSpeech- ääni loppuu
  • onPartialResult- On olemassa välitunnistuksen tuloksia. Aktivointilauseessa tämä tarkoittaa, että se toimi. Argumentti Hypoteesi
  • onResult- tunnustamisen lopullinen tulos. Tätä menetelmää kutsutaan menetelmän kutsun jälkeen Stop klo SpeechRecognizer. Argumentti Hypoteesi sisältää tunnistustiedot (merkkijono ja pisteet)

Toteuttamalla menetelmät onPartialResult ja onResult tavalla tai toisella voit muuttaa tunnistuslogiikkaa ja saada lopputuloksen. Näin se tehdään sovelluksemme tapauksessa:

@Override public void onEndOfSpeech() ( Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) ( mRecognizer.stop(); ) ) @Override public void onPartialResult(thesispothes)is ( if (hypoteesi == null) return; Merkkijonoteksti = hypoteesi.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) ( startRecognition(); ) else ( Log.d(TAG, teksti); ) ) @Override public void onResult(Hypothesis hypothesis) ( mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); Merkkijonoteksti = hypoteesi != null ? hypothesis.d:TAG; , "onResult" + teksti; if (KOMENTO ); ) mRecognizer.startListening(KWS_SEARCH);

Kun vastaanotamme onEndOfSpeech-tapahtuman ja jos samalla tunnistamme suoritettavan komennon, meidän on pysäytettävä tunnistus, jonka jälkeen onResult kutsutaan välittömästi.
OnResultissa sinun on tarkistettava, mikä juuri tunnistettiin. Jos tämä on komento, sinun on käynnistettävä se suorittamista varten ja kytkettävä moottori tunnistamaan aktivointilause.
OnPartialResultissa meitä kiinnostaa vain aktivointilauseen tunnistaminen. Jos havaitsemme sen, käynnistämme välittömästi komennon tunnistusprosessin. Tältä se näyttää:

Yksityinen synkronoitu void startRecognition() ( if (mRecognizer == null || KOMENTO TONE_CDMA_PIP, 200; post(400, new Runnable() ( @Override public void run() ( mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, 3000, "Listend. komennot"); post(4000, mStopRecognitionCallback); ) )); )
Tässä soitamme ensin pienen signaalin ilmoittaaksemme käyttäjälle, että olemme kuulleet hänet ja olemme valmiita hänen komentoinsa. Tänä aikana mikrofonin tulee olla pois päältä. Siksi aloitamme tunnistamisen lyhyen aikakatkaisun jälkeen (hieman pidemmän kuin signaalin kesto, jotta emme kuule sen kaikua). Se myös käynnistää säikeen, joka lopettaa tunnistuksen väkisin, jos käyttäjä puhuu liian pitkään. Tässä tapauksessa se on 3 sekuntia.

Kuinka muuttaa tunnistettu merkkijono komennoiksi

No, kaikki täällä on tiettyä sovelluskohtaista. Paljaan esimerkin tapauksessa vedämme yksinkertaisesti laitteiden nimet riviltä, ​​etsimme halutun laitteen ja joko muutamme sen tilaa HTTP-pyynnöllä älykodin ohjaimelle tai raportoimme sen nykyisen tilan (kuten termostaatti). Tämä logiikka näkyy Controller-luokassa.

Kuinka syntetisoida puhe

Puhesynteesi on tunnistamisen käänteinen toiminta. Tässä asia on päinvastoin - sinun on muutettava tekstirivi puheeksi, jotta käyttäjä voi kuulla sen.
Termostaatin tapauksessa meidän on saatava Android-laitteemme puhumaan nykyinen lämpötila. API:n käyttö TextToSpeech tämä on melko helppo tehdä (kiitos Googlelle upeasta naispuolisesta venäjän kielen TTS:stä):

Yksityinen tyhjä puhe(merkkijonoteksti) ( synkronoitu (mSpeechQueue) (mRecognizer.stop(); mSpeechQueue.add(teksti); HashMap params = uusi HashMap (2);

params.put(Puheteksti.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString()); params.put(Puhuteksti.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); params.put(Puheen teksti.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true");
mTextToSpeech.speak(teksti, TextToSpeech.QUEUE_ADD, params);

) )

Sanon varmaan jotain banaalia, mutta

Ennen synteesiprosessia on tarpeen poistaa tunnistus käytöstä

Kyllä! Kuten näet, puheen nopea ja tehokas tunnistaminen suoraan laitteessa ei ole ollenkaan vaikeaa, kiitos tällaisten upeiden projektien, kuten Pocketsphinx, läsnäolon. Se tarjoaa erittäin kätevän API:n, jota voidaan käyttää puhekomentojen tunnistamiseen liittyvien ongelmien ratkaisemiseen.

Tässä esimerkissä olemme liittäneet tunnistuksen täysin tiettyyn tehtävään - kodin älylaitteiden ääniohjaus. Paikallisen tunnistuksen ansiosta saavutimme erittäin suuren nopeuden ja minimoimme virheet.
On selvää, että samaa koodia voidaan käyttää muihin ääniin liittyviin tehtäviin. Sen ei tarvitse olla älykäs koti.

Lisää tunnisteita

Päivitetty: maanantaina 31. heinäkuuta 2017

Mitä tekemistä puolifantastisella ajattelulla tietokoneelle puhumisesta on ammattivalokuvauksen kanssa? Lähes ei yhtään, ellet ole fani ajatukselle ihmisen koko teknisen ympäristön loputtomasta kehittämisestä. Kuvittele hetkeksi, että annat kamerallesi äänikäskyjä muuttaa polttoväliä ja tehdä valotuksen korjaus puoli stop plus. Kameran kaukosäädin on jo toteutettu, mutta siellä pitää painaa hiljaa painikkeita, mutta tässä on kuulokamera! Perinteeksi on muodostunut jonkin tieteiselokuvan mainitseminen esimerkkinä ihmisen ja tietokoneen välisestä puheviestinnästä, esimerkiksi Stanley Kubrickin ohjaama "2001: A Space Odyssey". Siellä ajotietokone ei vain käy mielekästä vuoropuhelua astronautien kanssa, vaan voi lukea huulilta kuin kuuro. Toisin sanoen kone on oppinut tunnistamaan ihmisen puheen ilman virheitä. Ehkä kameran kauko-ääniohjaus tuntuu joillekin tarpeettomalta, mutta monet haluaisivat tämän lauseen"Ota meidät alas, kulta"

ja valokuva koko perheestä palmun taustalla on valmis. No, kunnioitin perinteitä ja haaveilin hieman. Mutta sydämestä puhuen tätä artikkelia oli vaikea kirjoittaa, ja kaikki alkoi lahjasta älypuhelimen muodossa, jossa on Android 4 OS. Tässä HUAWEI U8815 -mallissa on pieni neljän tuuman kosketusnäyttö ja näytön näppäimistö. On hieman epätavallista kirjoittaa siihen, mutta osoittautuu, että se ei ole erityisen välttämätöntä.

(kuva01)

1. Äänentunnistus älypuhelimessa, jossa on Android-käyttöjärjestelmä Kun kokeilin uutta lelua, huomasin hakupalkissa mikrofonin Google ja näppäimistöllä Notesissa. Aiemmin en ollut kiinnostunut tämän symbolin merkityksestä. Minulla oli keskusteluja Skype Kun kokeilin uutta lelua, huomasin hakupalkissa mikrofonin venäjänkielinen puhehaku lisättiin ja ilmestyi ohjelmia, joiden avulla voit sanella tekstiviestejä selainta käytettäessä "Kromi".

Sanoin kolmen sanan lauseen, ohjelma tunnisti ne ja näytti ne solussa sinisellä taustalla. Tässä oli jotain yllättävää, koska kaikki sanat oli kirjoitettu oikein. Jos napsautat tätä solua, lause tulee näkyviin Android-muistikirjan tekstikenttään. Sanoin siis vielä pari lausetta ja lähetin assistentille viestin tekstiviestillä.


2. Lyhyt historia puheentunnistusohjelmista.

Minulle ei ollut havainto, että puheohjauksen nykyaikainen kehitys mahdollistaisi komentojen antamisen kodinkoneille, autoille ja roboteille. Komentotila otettiin käyttöön aiemmissa Windows-, OS/2- ja Mac OS -versioissa. Olen törmännyt puhuviin ohjelmiin, mutta mitä hyötyä niistä on? Ehkä minun erikoisuuteni on, että minun on helpompi puhua kuin kirjoittaa näppäimistöllä, mutta matkapuhelimella en osaa kirjoittaa yhtään mitään. Sinun on kirjoitettava yhteystiedot kannettavalle tietokoneelle tavallisella näppäimistöllä ja siirrettävä ne USB-kaapelilla. Mutta vain puhuminen mikrofoniin ja tietokoneeseen kirjoittaakseni itse tekstin ilman virheitä oli minulle unelma. Toivottomuuden ilmapiiriä ylläpidettiin foorumeilla käydyillä keskusteluilla. Niissä oli kaikkialla niin surullinen ajatus:

"Todellisuudessa todellista puheentunnistusta (ja edes venäjäksi) tarkoitettuja ohjelmia ei kuitenkaan käytännössä ole olemassa, eikä niitä ilmeisestikään luoda pian. Lisäksi edes käänteistä tunnistamisen ongelmaa - puhesynteesiä, joka näyttää olevan paljon yksinkertaisempaa kuin tunnistus, ei ole täysin ratkaistu." (ComputerPress No. 12, 2004)

”Tavallisia puheentunnistusohjelmia (ei vain venäjäksi) ei edelleenkään ole, koska tehtävä on tietokoneelle melko vaikea. Ja pahinta on, että ihmisten sanantunnistusmekanismia ei ole vielä toteutettu, joten tunnistusohjelmia luotaessa ei ole mitään syytä aloittaa. (Toinen keskustelu foorumilla).

Samaan aikaan englanninkielisten puhetekstinsyöttöohjelmien arvostelut osoittivat selviä onnistumisia. Esimerkiksi, IBM ViaVoice 98 Executive Edition perussanavarastossa oli 64 000 sanaa ja mahdollisuus lisätä sama määrä omia sanoja. Sanantunnistuksen prosenttiosuus ilman koulutusta ohjelmassa oli noin 80 % ja myöhemmässä työskentelyssä tietyn käyttäjän kanssa saavutti 95 %.

Venäjän kielen tunnistusohjelmista on syytä huomata “Gorynych” - lisäys englanninkieliseen Dragon Dictate 2.5:een. Kerron sinulle etsinnästä ja sitten "taistelusta viiden Gorynychin kanssa" arvostelun toisessa osassa. Ensimmäinen, jonka löysin, oli "Englannin lohikäärme".

3. Jatkuva puheentunnistusohjelma "Dragon Naturally Speaking"

Nykyaikainen versio yrityksen ohjelmasta "Vivahde" päätyi vanhaan ystäväni Minskin vieraiden kielten instituutista. Hän toi sen takaisin ulkomaanmatkalta ja osti sen ajatellen, että se voisi olla "tietokonesihteeri". Mutta jokin ei toiminut, ja ohjelma jäi kannettavaan tietokoneeseen, melkein unohdettu. Selkeän kokemuksen puutteen vuoksi jouduin itse menemään ystäväni luo. Kaikki tämä pitkä johdanto on tarpeen tekemieni johtopäätösten ymmärtämiseksi oikein.

Ensimmäisen lohikäärmeeni koko nimi oli: . Ohjelma on englanninkielinen ja kaikki siinä on selkeää myös ilman manuaalia. Ensimmäinen askel on luoda tietylle käyttäjälle profiili, jonka avulla voidaan määrittää hänen esityksensä sanojen ääniominaisuudet. Näin tein – puhujan ikä, maa ja ääntämisominaisuudet ovat tärkeitä. Valintani on seuraava: ikä 22–54 vuotta vanha, Yhdistyneen kuningaskunnan englanti, normaali ääntäminen. Seuraavassa on useita ikkunoita, joissa voit määrittää mikrofonin. (kuva04)

Vakavien puheentunnistusohjelmien seuraava vaihe on tietyn henkilön ääntämisominaisuuksien koulutus. Sinua pyydetään valitsemaan tekstin luonne: valintani on lyhyt saneluohje, mutta voit "tilata" myös humoristisen tarinan.

Tämän ohjelman kanssa työskentelyvaiheen ydin on erittäin yksinkertainen - teksti näkyy ikkunassa, jonka yläpuolella on keltainen nuoli. Kun se lausutaan oikein, nuoli liikkuu lauseiden välillä ja alareunassa on harjoituksen edistymispalkki. Olin jokseenkin unohtanut keskustelun englannin, joten edistyin vaikeasti. Aika oli myös rajallinen - tietokone ei ollut minun ja jouduin keskeyttämään harjoittelun. Mutta ystävä sanoi, että hän teki testin alle puolessa tunnissa. (kuva05)

Kieltäydyin antamasta ohjelmaa muokata ääntämistäni, joten menin pääikkunaan ja käynnistin sisäänrakennetun tekstieditorin. Hän puhui yksittäisiä sanoja joistakin teksteistä, jotka hän löysi tietokoneelta. Ohjelma tulosti sanat, jotka hän sanoi oikein, ja korvasi ne, jotka hän sanoi huonosti, jollain "englanniksi". Ääntettyään komennon "erase line" selkeästi englanniksi, ohjelma suoritti sen. Tämä tarkoittaa, että luin komennot oikein ja ohjelma tunnistaa ne ilman koulutusta.

Mutta minulle oli tärkeää, kuinka tämä "lohikäärme" kirjoittaa venäjäksi. Kuten edellisestä kuvauksesta ymmärsit, ohjelmaa harjoitellessa voit valita vain englanninkielistä tekstiä, siellä ei yksinkertaisesti ole venäjää. On selvää, että venäläisen puheentunnistusta ei voida kouluttaa. Seuraavassa kuvassa näet, minkä lauseen ohjelma kirjoitti lausuessaan venäjän sanan "Hei". (kuva06)

Keskustelun lopputulos ensimmäisen lohikäärmeen kanssa osoittautui hieman koomiseksi. Jos luet huolellisesti virallisella verkkosivustolla olevan tekstin, näet tämän ohjelmistotuotteen englanninkielisen "erikoistumisen". Lisäksi latauksen aikana luemme ohjelmaikkunassa "englanniksi". Joten miksi tämä kaikki oli tarpeellista? On selvää, että foorumit ja huhut ovat syyllisiä...

Mutta on myös hyödyllistä kokemusta. Ystäväni pyysi nähdä kannettavan tietokoneensa kunnon. Jotenkin hitaasti hän alkoi työskennellä. Tämä ei ole yllättävää - järjestelmäosiossa oli vain 5% vapaata tilaa. Kun poistin tarpeettomia ohjelmia, huomasin, että virallinen versio vei yli 2,3 Gt. Tämä luku on hyödyllinen meille myöhemmin. (image.07)



Kuten kävi ilmi, venäläisen puheen tunnistaminen oli ei-triviaali tehtävä. Minskissä onnistuin löytämään "Gorynych" ystävältäni. Hän etsi levyä pitkään vanhasta raunioistaan ​​ja tämä on hänen mukaansa virallinen julkaisu. Ohjelma asennettiin välittömästi, ja sain selville, että sen sanakirja sisältää 5000 venäjän sanaa plus 100 komentoa ja 600 englanninkielistä sanaa plus 31 komentoa.

Ensin sinun on asetettava mikrofoni, minkä tein. Sitten avasin sanakirjan ja lisäsin sanan "tutkinta" koska sitä ei ollut ohjelmasanakirjassa. Yritin puhua selkeästi ja yksitoikkoisesti. Lopulta avasin Gorynych Pro 3.0 -ohjelman, otin sanelutilan päälle ja sain tämän luettelon "läheltä kuulostavista sanoista". (image.09)

Tulos hämmensi minua, koska se erosi selvästi huonommin Android-älypuhelimen toiminnasta, ja päätin kokeilla muita ohjelmia " Google Chrome verkkokauppa". Ja lykkäsin "gorynych-käärmeiden" käsittelemistä myöhemmin. Luulin sen olevan lykkäys toimintaa alkuperäisessä venäläisessä hengessä

5. Googlen ääniominaisuudet

Jos haluat käyttää ääntä tavallisessa Windows-tietokoneessa, sinun on asennettava selain Google Chrome. Jos käytät sitä verkossa, voit napsauttaa ohjelmistokaupan linkkiä oikeassa alakulmassa. Löysin sieltä täysin ilmaiseksi kaksi ohjelmaa ja kaksi laajennusta äänitekstin syöttöä varten. Ohjelmat ovat ns "Äänimuistio" Ja "Voicenot - ääni tekstiksi". Asennuksen jälkeen ne löytyvät välilehdeltä "Sovellukset" selaimesi "Kromi". (kuva 10)

Laajennuksia kutsutaan "Google Voice Search Hotword (Beta) 0.1.0.5" Ja "Äänitekstinsyöttö - Speechpad.ru 5.4". Asennuksen jälkeen ne voidaan sammuttaa tai poistaa välilehdeltä "Laajennukset".(kuva 11)

VoiceNote. Kaksoisnapsauta ohjelman kuvaketta Chrome-selaimen sovellusvälilehdellä. Valintaikkuna avautuu kuten alla olevassa kuvassa. Napsauttamalla mikrofonikuvaketta puhut lyhyitä lauseita mikrofoniin. Ohjelma lähettää sanasi puheentunnistuspalvelimelle ja kirjoittaa tekstin ikkunaan. Kaikki kuvassa näkyvät sanat ja lauseet kirjoitettiin ensimmäistä kertaa. Ilmeisesti tämä menetelmä toimii vain, kun Internet-yhteys on aktiivinen. (kuva 12)

Äänimuistio. Jos käynnistät ohjelman Sovellukset-välilehdeltä, uusi Internet-sivun välilehti avautuu Speechpad.ru. Siellä on tarkat ohjeet tämän palvelun käyttöön ja kompakti lomake. Jälkimmäinen näkyy alla olevassa kuvassa. (kuva 13)

Äänisyöttö Tekstin avulla voit täyttää Internet-sivujen tekstikentät äänelläsi. Kävin esimerkiksi sivullani "Google+". Napsauta uuden viestin syöttökentässä hiiren kakkospainikkeella ja valitse "Speechpad". Vaaleanpunainen syöttöikkuna osoittaa, että voit sanella tekstiäsi. (kuva 14)

Google Voice Search mahdollistaa äänihaun. Kun asennat ja aktivoit tämän laajennuksen, hakupalkkiin tulee mikrofonisymboli. Kun painat sitä, symboli ilmestyy suureen punaiseen ympyrään. Sano vain hakulauseesi, niin se näkyy hakutuloksissa. (kuva 15)

Tärkeä huomautus: Jotta mikrofoni toimisi Chrome-laajennusten kanssa, sinun on sallittava mikrofonin käyttö selaimesi asetuksista. Se on oletuksena poistettu käytöstä turvallisuussyistä. Siirry osoitteeseen Asetukset → Henkilökohtaiset tiedot → Sisältöasetukset. (Jos haluat käyttää kaikkia asetuksia luettelon lopussa, napsauta Näytä lisäasetukset). Valintaikkuna avautuu Sivun sisältöasetukset. Valitse kohde luettelosta Multimedia → mikrofoni.

6. Venäläisten puheentunnistusohjelmien kanssa työskentelyn tulokset

Pieni kokemus äänitekstinsyöttöohjelmien käytöstä on osoittanut tämän ominaisuuden erinomaisen toteutuksen Internet-yrityksen palvelimilla Kun kokeilin uutta lelua, huomasin hakupalkissa mikrofonin. Ilman esikoulutusta sanat tunnistetaan oikein. Tämä osoittaa, että venäläisen puheentunnistuksen ongelma on ratkaistu.

Nyt voimme sanoa, että tulos kehityksestä Kun kokeilin uutta lelua, huomasin hakupalkissa mikrofonin tulee olemaan uusi kriteeri muiden valmistajien tuotteiden arvioinnissa. Haluaisin tunnistusjärjestelmän toimivan offline-tilassa ilman pääsyä yrityksen palvelimille - se on kätevämpää ja nopeampaa. Mutta ei tiedetä, milloin itsenäinen ohjelma jatkuvan venäläisen puhevirran kanssa työskentelyyn julkaistaan. Kannattaa kuitenkin olettaa, että harjoittelumahdollisuuden myötä tästä "luomisesta" tulee todellinen läpimurto.

Venäläisten kehittäjien ohjelmat "Gorynych", "Diktografi" Ja "Taistelu" Palaan yksityiskohtiin tämän katsauksen toisessa osassa. Tämä artikkeli kirjoitettiin hyvin hitaasti, koska alkuperäisten levyjen etsiminen on nyt vaikeaa. Tällä hetkellä minulla on jo kaikki versiot venäläisistä ääni-tekstitunnistuskoneista paitsi "Combat 2.52". Kenelläkään ystävistäni tai kollegoistani ei ole tätä ohjelmaa, ja minulla itselläni on vain muutamia kehuvia arvosteluja foorumeilla. Totta, siellä oli niin outo vaihtoehto - lataa "Combat" tekstiviestillä, mutta en pidä siitä. (kuva16)


Lyhyt videopätkä näyttää, kuinka puheentunnistus toimii älypuhelimessa, jossa on Android OS. Äänikirjoituksen erikoisuus on tarve muodostaa yhteys Googlen palvelimiin. Näin Internetin pitäisi toimia

  • Opastus

Tässä artikkelissa haluan tarkastella sellaisen mielenkiintoisen ohjelmistokehitysalueen perusteita kuin puheentunnistus. En tietenkään ole tämän aiheen asiantuntija, joten tarinani tulee olemaan täynnä epätarkkuuksia, virheitä ja pettymyksiä. "Työni" päätavoitteena, kuten otsikostakin voi päätellä, ei kuitenkaan ole ongelman ammattimainen analyysi, vaan peruskäsitteiden, ongelmien ja niiden ratkaisujen kuvaus. Yleisesti ottaen pyydän kaikkia kiinnostuneita tulemaan kissalle!

Prologi

Aloitetaan siitä tosiasiasta, että puheemme on äänisarja. Ääni puolestaan ​​on eritaajuisten äänivärähtelyjen (aaltojen) superpositio (superpositio). Kuten tiedämme fysiikasta, aallolle on ominaista kaksi ominaisuutta - amplitudi ja taajuus.

Tällä tavalla mekaaniset värähtelyt muunnetaan numerosarjaksi, joka soveltuu käsiteltäviksi nykyaikaisissa tietokoneissa.

Tästä seuraa, että puheentunnistuksen tehtävä laskee "vertaamalla" numeroarvoja (digitaalinen signaali) ja sanoja tietystä sanakirjasta (esimerkiksi venäjäksi).

Selvitetään, kuinka tämä "vertailu" voidaan itse asiassa toteuttaa.

Syötä tiedot

Oletetaan, että meillä on äänidataa sisältävä tiedosto/virta. Ensinnäkin meidän on ymmärrettävä, miten se toimii ja miten sitä luetaan. Katsotaanpa yksinkertaisinta vaihtoehtoa - WAV-tiedostoa.

Muoto tarkoittaa, että tiedostossa on kaksi lohkoa. Ensimmäinen lohko on otsikko, jossa on tietoja äänivirrasta: bittinopeus, taajuus, kanavien lukumäärä, tiedoston pituus jne. Toinen lohko koostuu "raaka" datasta - samasta digitaalisesta signaalista, joukosta amplitudiarvoja.

Tietojen lukemisen logiikka tässä tapauksessa on melko yksinkertainen. Luemme otsikon, tarkistamme joitain rajoituksia (ei esimerkiksi pakkausta), tallennamme tiedot erityisesti varattuun taulukkoon.

Tunnustus

Puhtaasti teoreettisesti voimme nyt verrata (elementti elementiltä) meillä olevaa näytettä johonkin toiseen, jonka teksti on meille jo tiedossa. Eli yritä "tunnistaa" puhe... Mutta parempi olla tekemättä tätä :)

Lähestymistapamme tulee kestää (no, ainakin vähän) äänen (sanan ääntävän henkilön), äänenvoimakkuuden ja ääntämisnopeuden muutoksia. Luonnollisesti tätä ei voida saavuttaa vertaamalla kahta äänisignaalia elementtikohtaisesti.

Siksi lähdemme hieman eri tavalla.

Kehykset

Ensinnäkin jaetaan tietomme pieniin aikajaksoihin - kehyksiin. Lisäksi kehysten ei pitäisi mennä tiukasti peräkkäin, vaan "päällekkäin". Ne. yhden kehyksen lopun on leikattava toisen kehyksen alun kanssa.

Kehykset ovat sopivampi data-analyysin yksikkö kuin tietyt signaaliarvot, koska on paljon kätevämpää analysoida aaltoja tietyllä aikavälillä kuin tietyissä kohdissa. Kehysten "päällekkäinen" järjestely mahdollistaa kehysanalyysin tulosten tasoittamisen muuttamalla kehysideasta alkuperäistä toimintoa (signaaliarvot) pitkin liikkuvaksi "ikkunaksi".

On kokeellisesti todettu, että optimaalisen kehyksen pituuden tulisi vastata 10 ms:n väliä ja "päällekkäisyyttä" 50%. Ottaen huomioon, että keskimääräinen sanan pituus (ainakin minun kokeissani) on 500 ms, tämä vaihe antaa meille noin 500 / (10 * 0,5) = 100 kehystä sanaa kohti.

Sanojen jakaminen

Ensimmäinen tehtävä, joka on ratkaistava puheen tunnistamisessa, on juuri tämän puheen jakaminen yksittäisiksi sanoiksi. Yksinkertaisuuden vuoksi oletetaan, että meidän tapauksessamme puhe sisältää taukoja (hiljaisuusjaksoja), joita voidaan pitää sanojen "erottelijoina".

Tässä tapauksessa meidän on löydettävä tietty arvo, kynnys - arvot, joiden yläpuolella ovat sana, jonka alapuolella ovat hiljaisuus. Tässä voi olla useita vaihtoehtoja:

  • asetettu vakioksi (toimii, jos alkuperäinen signaali generoidaan aina samoissa olosuhteissa, samalla tavalla);
  • klusterisignaaliarvot valitsemalla eksplisiittisesti hiljaisuutta vastaavat arvot (tämä toimii vain, jos hiljaisuus vie merkittävän osan alkuperäisestä signaalista);
  • analysoida entropiaa;

Kuten jo arvasit, puhumme nyt viimeisestä kohdasta :) Aloitetaan siitä, että entropia on epäjärjestyksen mitta, "kaiken kokemuksen epävarmuuden mitta" (c). Meidän tapauksessamme entropia tarkoittaa, kuinka paljon signaalimme "vaihtelee" tietyssä kehyksessä.

  • Oletetaan, että signaalimme on normalisoitu ja kaikki sen arvot ovat alueella [-1;1];
  • Rakennetaan histogrammi (jakauman tiheys) kehyssignaalin arvoista:
lasketaan entropia as ;

Ja niin, saimme entropiaarvon. Mutta tämä on vain toinen kehyksen ominaisuus, ja erottaaksemme äänen hiljaisuudesta, meidän on silti verrattava sitä johonkin. Jotkut artikkelit suosittelevat ottamaan entropiakynnyksen, joka on yhtä suuri kuin sen maksimi- ja minimiarvojen keskiarvo (kaikista kehyksistä). Omassa tapauksessani tämä lähestymistapa ei kuitenkaan tuottanut hyviä tuloksia.
Onneksi entropia (toisin kuin sama keskimääräinen arvojen neliö) on suhteellisen itsenäinen suure. Tämä antoi minulle mahdollisuuden valita sen kynnyksen arvon vakion (0,1) muodossa.

Ongelmat eivät kuitenkaan lopu tähän: (Entropia voi painua sanan keskellä (vokaalien kohdalla) tai se voi yhtäkkiä hypätä ylös pienen kohinan takia. Ensimmäisen ongelman ratkaisemiseksi meidän on esitettävä käsite "sanojen välinen vähimmäisetäisyys" ja "liima yhteen" lähellä olevat kehykset, jotka erottuivat vajoamisen vuoksi. Toinen ongelma ratkaistaan ​​käyttämällä "sanan vähimmäispituutta" ja leikkaamalla pois kaikki ehdokkaat, jotka eivät läpäisseet valintaa. käytetään ensimmäisessä kohdassa).

Jos puhe ei ole periaatteessa "artikuloitua", voit yrittää jakaa alkuperäisen kehyksen tietyllä tavalla valmistettuihin osasarjoihin, joista jokainen alistetaan tunnistusmenettelyyn. Mutta se on täysin eri tarina :)

Ja niin, meillä on joukko kehyksiä, jotka vastaavat tiettyä sanaa. Voimme seurata pienimmän vastuksen polkua ja käyttää kaikkien sen arvojen keskimääräistä neliötä (Root Mean Square) kehyksen numeerisena ominaisuutena. Tällainen metriikka sisältää kuitenkin hyvin vähän lisäanalyysiin sopivaa tietoa.

Tässä kohtaa Mel-taajuuden cepstraalikertoimet tulevat peliin. Wikipedian mukaan (joka, kuten tiedätte, ei valehtele), MFCC on eräänlainen esitys signaalin energiaspektristä. Sen käytön edut ovat seuraavat:

  • Käytetään signaalispektriä (eli ortogonaalisten [ko]sinifunktioiden kantalaajennusta), mikä mahdollistaa signaalin aallon "luonteen" huomioimisen jatkoanalyysissä;
  • Spektri projisoidaan erityiselle mel-asteikolle, jonka avulla voit korostaa ihmisen havainnon kannalta merkittävimmät taajuudet;
  • Laskettujen kertoimien määrä voidaan rajoittaa mihin tahansa arvoon (esimerkiksi 12), mikä mahdollistaa kehyksen "pakkauksen" ja sen seurauksena käsitellyn tiedon määrän;

Katsotaanpa tietyn kehyksen MFCC-kertoimien laskentaprosessia.

Kuvitellaan kehyksemme vektorina, jossa N on kehyksen koko.

Fourier-sarjan laajennus

Ensinnäkin laskemme signaalin spektrin diskreetin Fourier-muunnoksen avulla (mieluiten sen "nopea" FFT-toteutus).

Eli tulos on seuraavan muotoinen vektori:

On tärkeää ymmärtää, että tämän muunnoksen jälkeen X-akselia pitkin meillä on signaalin taajuus (hz) ja Y-akselilla suuruus (tapa päästä eroon monimutkaisista arvoista):

Mel-suodattimien laskenta

Aloitetaan siitä, mikä mel on. Jälleen Wikipedian mukaan mel on "psykofyysinen äänenkorkeuden yksikkö", joka perustuu keskivertoihmisten subjektiiviseen havaintoon. Riippuu ensisijaisesti äänen taajuudesta (sekä äänenvoimakkuudesta ja sointisävelestä). Toisin sanoen tämä arvo osoittaa, kuinka paljon tietyn taajuuden ääni on meille "merkittävä".

Voit muuntaa taajuuden liiduksi seuraavalla kaavalla (muista se kaavana 1):

Käänteinen muunnos näyttää tältä (muista se "kaavana 2"):

mel/taajuuskaavio:

Mutta palataanpa tehtäväämme. Oletetaan, että meillä on 256 elementin kehys. Tiedämme (äänimuototiedoista), että äänitaajuus tässä kehyksessä on 16000hz. Oletetaan, että ihmisen puhe on alueella Hz. Asetetaan tarvittavien pienten kertoimien määräksi M = 10 (suositeltu arvo).

Edellä saadun spektrin hajottamiseksi mel-asteikolla meidän on luotava suodattimien "kampa". Pohjimmiltaan jokainen mel-suodatin on kolmion muotoinen ikkunatoiminto, jonka avulla voit laskea yhteen energiamäärän tietyllä taajuusalueella ja saada siten mel-kertoimen. Kun tiedämme pienten kertoimien määrän ja analysoidun taajuusalueen, voimme rakentaa joukon suodattimia seuraavasti:

Huomaa, että mitä suurempi liitukertoimen sarjanumero on, sitä leveämpi on suodattimen pohja. Tämä johtuu siitä, että meitä kiinnostavan taajuusalueen jakaminen suodattimien käsittelemiin alueisiin tapahtuu liituasteikolla.

Mutta hajamielimme taas. Ja niin meidän tapauksessamme meitä kiinnostava taajuusalue on yhtä suuri kuin . Kaavan 1 mukaan tämä alue muuttuu liidun asteikolla arvoksi .

m[i] =

Huomaa, että liituasteikon pisteet ovat tasaisin välein. Muunnetaan asteikko takaisin hertseiksi kaavan 2 avulla:

h[i] =

Kuten näette, asteikko on nyt alkanut vähitellen venyä, mikä tasoittaa "merkittävyyden" kasvun dynamiikkaa matalilla ja korkeilla taajuuksilla.

Nyt meidän on asetettava tuloksena oleva asteikko kehyksemme spektriin. Kuten muistamme, X-akselilla meillä on taajuus. Spektrin pituus on 256 elementtiä, kun taas siihen mahtuu 16000hz. Kun olet ratkaissut yksinkertaisen osuuden, saat seuraavan kaavan:

f(i) = kerros((kehyksen koko+1) * h(i) / näytenopeus)

Mikä meidän tapauksessamme on vastaava

f(i) = 4, 8, 12, 17, 23, 31, 40, 52, 66, 82, 103, 128

Siinä se! Kun tiedämme spektrimme X-akselin vertailupisteet, on helppo rakentaa tarvitsemamme suodattimet seuraavalla kaavalla:

Suodattimien käyttö, spektrienergian logaritmi

Suodattimen käyttö koostuu sen arvojen pareittain kertomisesta spektriarvoilla. Tämän operaation tulos on mel-kerroin. Koska meillä on M suodatinta, kertoimia on sama määrä.

Meidän ei kuitenkaan tarvitse soveltaa mel-suodattimia spektrin arvoihin, vaan sen energiaan. Ota sitten tulosten logaritmi. Tämän uskotaan vähentävän kertoimien herkkyyttä kohinalle.

Kosinimuunnos

Diskreettiä kosinimuunnosta (DCT) käytetään näiden "cepstral"-kertoimien saamiseksi. Sen tarkoitus on "tiivistää" saadut tulokset lisäämällä ensimmäisten kertoimien merkitystä ja vähentäen jälkimmäisten merkitystä.

Tässä tapauksessa DCTII:ta käytetään ilman kertolaskua (skaalaustekijällä).

Nyt jokaiselle kehykselle meillä on joukko M mfcc-kertoimia, joita voidaan käyttää jatkoanalyysiin.

Esimerkkikoodi yllä oleville menetelmille löytyy.

Tunnistusalgoritmi

Tässä, rakas lukija, odottaa sinua suurin pettymys. Olen nähnyt Internetissä paljon erittäin älykkäitä (ja ei niin älykkäitä) keskusteluja siitä, mikä tunnistusmenetelmä on parempi. Jotkut ihmiset kannattavat piilotettuja Markov-malleja, toiset hermoverkkoja, ja joidenkin ihmisten ajatuksia on periaatteessa mahdotonta ymmärtää :)

Joka tapauksessa SMM:lle annetaan paljon etusijaa, ja juuri niiden toteutuksen aion lisätä koodiani... tulevaisuudessa :)

Tällä hetkellä ehdotan keskittymistä paljon vähemmän tehokkaaseen, mutta paljon yksinkertaisempaan menetelmään.

Ja niin, muistakaamme, että tehtävämme on tunnistaa sana tietystä sanakirjasta. Yksinkertaisuuden vuoksi tunnistamme kymmenen ensimmäisen numeron nimet: "yksi", "kaksi", "kolme", ​​"neljä", "viisi", "kuusi", "seitsemän", "kahdeksan", "yhdeksän", "kymmenen".

Otetaan nyt iPhone/Android ja käydään L kollegoiden läpi pyynnöllä sanella nämä sanat tallentamista varten. Yhdistetään seuraavaksi (jossakin paikallisessa tietokannassa tai yksinkertaisessa tiedostossa) jokaiseen sanaan L sarjaa vastaavien tietueiden mfcc-kertoimia.

Kutsumme tätä kirjeenvaihtoa "malliksi" ja itse prosessia - koneoppimista! Itse asiassa pelkällä uusien näytteiden lisäämisellä tietokantaan on erittäin heikko yhteys koneoppimiseen... Mutta termi on liian muodikas :)

Nyt tehtävämme on valita "lähin" malli tietylle mfcc-kertoimien joukolle (tunnistettu sana). Ensi silmäyksellä ongelma voidaan ratkaista yksinkertaisesti:

  • jokaiselle mallille löydämme keskimääräisen (euklidisen) etäisyyden tunnistetun mfcc-vektorin ja mallivektoreiden välillä;
  • valitsemme oikeaksi malliksi sen keskimääräisen etäisyyden, johon on pienin;

Saman sanan voivat kuitenkin lausua sekä Andrei Malakhov että jotkut hänen virolaisista kollegoistaan. Toisin sanoen saman sanan mfcc-vektorin koko voi olla erilainen.

Onneksi eripituisten sekvenssien vertailun ongelma on jo ratkaistu Dynamic Time Warping -algoritmin muodossa. Tämä dynaaminen ohjelmointialgoritmi on kuvattu täydellisesti sekä porvarillisessa Wikissä että ortodoksisessa habr.

Ainoa muutos, joka siihen on tehtävä, on tapa löytää etäisyys. Meidän on muistettava, että mallin mfcc-vektori on itse asiassa kehyksistä saatu Mfcc- "alivektoreiden" sarja, jonka dimensio on M. Joten DTW-algoritmin on löydettävä näiden samojen M-mitan "alivektorien" sekvenssien välinen etäisyys. Eli etäisyysmatriisin arvoina on käytettävä kehysten mfcc:n "alivektorien" välisiä etäisyyksiä (euklidisia).

Kokeilut

Minulla ei ollut mahdollisuutta testata tämän lähestymistavan suorituskykyä suurella "koulutus"-näytteellä. Testien tulokset 3 kopion otoksesta jokaisesta sanasta ei-synteettisissä olosuhteissa osoittivat lievästi sanottuna parasta tulosta - 65% oikeista tunnistuksista.

Tavoitteenani oli kuitenkin luoda mahdollisimman yksinkertainen puheentunnistussovellus. Niin sanotusti "konseptin todiste" :) Lisää tageja

 
Artikkelit Tekijä: aihe:
Hakukoneen maineenhallintatyypit
Tässä artikkelissa tutustumme mielenkiintoiseen konseptiin verkkomarkkinoinnin maailmasta, nimittäin SERMiin. Tämä on lyhenne sanoista Search Engine Reputation Management. Kirjaimellisessa käännöksessä saamme "mainehallinta
YouTube-avainsanatyökalu Suositut YouTube-avainsanat
Olemme julkaisseet uuden kirjan Sosiaalisen median sisältömarkkinointi: Kuinka saada seuraajiesi pään sisälle ja saada heidät rakastumaan brändiisi.
Jatkamme YouTubea käsittelevää artikkelisarjaa, puhumme avainsanojen keräämisestä ja arvioimme niiden vaikutusta videon sijoitukseen.  Pätevästi alle
Kompakti USB Wi-Fi-moduuli
Koska Windows 10 -käyttöjärjestelmää kehitetään jatkuvasti, jotkin sen komponentit eivät välttämättä toimi.  Uusimmissa versioissa (16199, 16215 ja muut) on mahdotonta saada TL-WN823N USB Wi-Fi -sovitinta toimimaan pisteenä d
Motorola Moto X - Tekniset tiedot Mobiiliverkko on radiojärjestelmä, jonka avulla useat mobiililaitteet voivat olla yhteydessä toisiinsa