Programování

Výukový program JavaScript: Přidejte do své webové aplikace rozpoznávání řeči

Zatímco prohlížeče směřují k podpoře rozpoznávání řeči a více futuristických schopností, vývojáři webových aplikací jsou obvykle omezeni na klávesnici a myš. Ale co kdybychom mohli rozšířit interakci klávesnice a myši s jinými režimy interakce, jako jsou hlasové příkazy nebo pozice rukou?

V této sérii příspěvků vytvoříme základní mapový průzkumník s multimodálními interakcemi. Nejprve jsou hlasové příkazy. Než však začleníme jakékoli příkazy, nejprve budeme muset rozložit strukturu naší aplikace.

Naše aplikace, zaváděcí s vytvořit-reagovat-aplikaci, bude mapa na celou obrazovku využívající komponenty React pro Leaflet.js. Po spuštění vytvořit-reagovat-aplikaci, příze přidat leták, a příze přidat reakční leták, otevřeme naše Aplikace komponenta a definovat naši Mapa součástka:

importovat React, {Component} z 'reagovat';

importovat {Map, TileLayer} z 'reagovat-leták'

import './App.css';

aplikace třídy rozšiřuje komponentu {

stát = {

střed: [41.878099, -87,648116],

zvětšení: 12,

  };

updateViewport = (výřez) => {

this.setState ({

střed: viewport.center,

zoom: viewport.zoom,

    });

  };

poskytnout() {

const {

centrum,

Zvětšení,

} = this.state;

vrátit se (

style = {{height: '100%', width: '100%'}}

střed = {střed}

zoom = {zoom}

onViewportChange = {this.updateViewport}>

url = "// {s} .tile.openstreetmap.org / {z} / {x} / {y} .png"

attribution = "© přispěvatelé OpenStreetMap"

          />

    )

  }

}

exportovat výchozí aplikaci;

The Aplikace komponenta je stavová komponenta, která sleduje vlastnosti středu a zvětšení a předává je do Mapa součástka. Když uživatel interaguje s mapami pomocí integrovaných interakcí myši a klávesnice, jsme upozorněni, abychom aktualizovali náš stav o nový střed a úrovně přiblížení.

S definovanou komponentou pro celou obrazovku vypadá naše aplikace takto:

Po vybalení z krabice získáváme typické režimy interakce, včetně myši, klávesnice a dotyku na zařízeních, která je podporují. S našimi základními interakcemi a definovaným uživatelským rozhraním přidáme hlasové příkazy pro přiblížení a oddálení.

Existuje mnoho knihoven, které umožňují rozpoznávání řeči v prohlížeči. Chrome dokonce podporuje i základní SpeechDetection API. Použijeme annyang, populární a jednoduchou knihovnu pro detekci textu v jazyce JavaScript. S annyang definujete příkazy a jejich obslužné rutiny v objektu JavaScript, například takto:

const příkazy = {

'in': () => console.log ('in command received'),

'out': () => console.log ('out command received'),

};

Pak vše, co musíte udělat, je předat tento objekt do metody na annyang objekt a zavolat Start() na tom objektu. Celý příklad vypadá takto:

importovat annyang z 'annyang';

const příkazy = {

'in': () => console.log ('in command received'),

'out': () => console.log ('out command received'),

};

annyang.addCommands (příkazy);

annyang.start ();

To je super jednoduché, ale z kontextu to moc nedává smysl, tak to začleňme do naší komponenty React. V rámci componentDidMount hák, přidáme naše příkazy a začneme poslouchat, ale místo přihlášení do konzoly zavoláme dvě metody, které aktualizují úroveň přiblížení v našem stavu:

  zoomIn = () => {

this.setState ({

zoom: this.state.zoom + 1

    });

  };

zoomOut = (... args) => {

this.setState ({

zoom: this.state.zoom - 1

    });

  };

componentDidMount () {

annyang.addCommands ({

'in': this.zoomIn,

'out': this.zoomOut,

    });

annyang.start ();

  }

Když se naše stránka obnoví, prohlížeč nás požádá o povolení používat mikrofon. Pokud řeknete ano, můžete nyní přiblížit a oddálit hlasové příkazy „in“ a „out“. Chcete více? Knihovna annyang také podporuje zástupné symboly a regulární výrazy. Abychom podporovali přiblížení přímo na určitou úroveň, můžeme definovat příkaz takto:

  annyang.addCommands ({

/ * stávající příkazy * /

'zoom level: level': {regexp: / ^ zoom level (\ d +) /, callback: this.zoomTo},

    });

The :úroveň součástí klíče je standardní způsob definování jednoslovného zástupného symbolu. (Pokud bychom chtěli zástupný symbol pro více světů, mohli bychom použít *úroveň místo toho.) Ve výchozím nastavení je slovo zachycené zástupným znakem předáno jako argument řetězce funkci obslužné rutiny. Ale pokud definujeme obslužnou rutinu jako objekt s regulární výraz a zpětné volání klíče, můžeme dále omezit, jaký může být zástupný symbol. V tomto případě omezíme zástupný symbol pouze na číslice. Tento zástupný symbol bude i nadále předáván jako řetězec, takže když nastavíme úroveň přiblížení, budeme jej muset vynutit na číslo:

  zoomTo = (zoomLevel) => {

this.setState ({

zoom: + zoomLevel,

    });

  }

A to je vše! Nyní můžeme přiblížit nebo oddálit jednu úroveň po druhé, nebo můžeme přeskočit přímo na úroveň vyslovením jejího čísla. Pokud si s tím hrajete doma, všimnete si, že annyang trvá několik sekund, než příkaz zaregistruje, a někdy se příkazy nezaregistrují. Rozpoznávání řeči není dokonalé. Pokud vytváříte rozpoznávání řeči do produkčního systému, budete chtít začlenit mechanismy zpětné vazby v reálném čase pro chyby nebo zjistit, kdy knihovna aktivně poslouchá.

Pokud si chcete s kódem pohrát, najdete ho na GitHubu. Neváhejte a kontaktujte na Twitteru a sdílejte svá vlastní multimodální rozhraní: @freethejazz.

$config[zx-auto] not found$config[zx-overlay] not found