Spraakgestuurde webapps - Inleiding tot de Web Speech API

Met de nieuwe JavaScript Web Speech API kunt u eenvoudig spraakherkenning aan uw webpagina's toevoegen. Deze API biedt nauwkeurige controle en flexibiliteit over de spraakherkenningsmogelijkheden in Chrome versie 25 en hoger. Hier is een voorbeeld waarbij de herkende tekst vrijwel onmiddellijk verschijnt tijdens het spreken.

Web Speech API-demo

DEMO / BRON

Laten we eens onder de motorkap kijken. Eerst controleren we of de browser de Web Speech API ondersteunt door te controleren of het webkitSpeechRecognition object bestaat. Als dit niet het geval is, raden we de gebruiker aan zijn browser te upgraden. (Omdat de API nog experimenteel is, wordt deze momenteel door de leverancier voorafgegaan.) Ten slotte maken we het webkitSpeechRecognition -object dat de spraakinterface levert, en stellen we enkele van zijn attributen en gebeurtenishandlers in.

if (!('webkitSpeechRecognition' in window)) {
    upgrade();
} else {
    var recognition = new webkitSpeechRecognition();
    recognition.continuous = true;
    recognition.interimResults = true;

    recognition.onstart = function() { ... }
    recognition.onresult = function(event) { ... }
    recognition.onerror = function(event) { ... }
    recognition.onend = function() { ... }
    ...

De standaardwaarde voor continuous is false, wat betekent dat wanneer de gebruiker stopt met praten, de spraakherkenning stopt. Deze modus is ideaal voor eenvoudige tekst, zoals korte invoervelden. In deze demo hebben we dit op true ingesteld, zodat de herkenning doorgaat, zelfs als de gebruiker pauzeert tijdens het spreken.

De standaardwaarde voor interimResults is false, wat betekent dat de enige resultaten die door de herkenner worden geretourneerd definitief zijn en niet zullen veranderen. De demo stelt het in op 'true', zodat we vroege tussentijdse resultaten krijgen die kunnen veranderen. Bekijk de demo goed, de grijze tekst is de tekst die tussentijds is en soms verandert, terwijl de zwarte tekst reacties zijn van de herkenner die als definitief zijn gemarkeerd en niet zullen veranderen.

Om te beginnen klikt de gebruiker op de microfoonknop, waardoor deze code wordt geactiveerd:

function startButton(event) {
    ...
    final_transcript = '';
    recognition.lang = select_dialect.value;
    recognition.start();

We hebben de gesproken taal voor de spraakherkenner "lang" ingesteld op de BCP-47-waarde die de gebruiker heeft geselecteerd via de keuzelijst, bijvoorbeeld "en-US" voor Engels-Verenigde Staten. Als dit niet is ingesteld, wordt standaard de taal van het hoofdelement en de hiërarchie van het HTML-document gebruikt. Chrome-spraakherkenning ondersteunt talloze talen (zie de tabel ' langs ' in de demobron), evenals enkele van rechts naar links geschreven talen die niet in deze demo zijn opgenomen, zoals he-IL en ar-EG.

Nadat we de taal hebben ingesteld, roepen we recognition.start() aan om de spraakherkenner te activeren. Zodra het begint met het vastleggen van audio, roept het de onstart gebeurtenishandler aan en vervolgens voor elke nieuwe reeks resultaten de onresult gebeurtenishandler.

recognition.onresult = function(event) {
    var interim_transcript = '';

    for (var i = event.resultIndex; i < event.results.length; ++i) {
        if (event.results[i].isFinal) {
            final_transcript += event.results[i][0].transcript;
        } else {
            interim_transcript += event.results[i][0].transcript;
        }
    }
    final_transcript = capitalize(final_transcript);
    final_span.innerHTML = linebreak(final_transcript);
    interim_span.innerHTML = linebreak(interim_transcript);
    };
}

Deze handler voegt alle tot nu toe ontvangen resultaten samen in twee tekenreeksen: final_transcript en interim_transcript . De resulterende tekenreeksen kunnen '\n' bevatten, bijvoorbeeld wanneer de gebruiker 'nieuwe paragraaf' uitspreekt. Daarom gebruiken we de linebreak om deze naar HTML-tags <br> of <p> te converteren. Ten slotte worden deze tekenreeksen ingesteld als de innerHTML van hun overeenkomstige <span> -elementen: final_span , opgemaakt met zwarte tekst, en interim_span , opgemaakt met grijze tekst.

interim_transcript is een lokale variabele en wordt elke keer dat deze gebeurtenis wordt aangeroepen volledig opnieuw opgebouwd, omdat het mogelijk is dat alle tussentijdse resultaten zijn gewijzigd sinds de laatste onresult gebeurtenis. We zouden hetzelfde kunnen doen voor final_transcript door simpelweg de for-lus op 0 te starten. Omdat de uiteindelijke tekst echter nooit verandert, hebben we de code hier iets efficiënter gemaakt door final_transcript een globaal te maken, zodat deze gebeurtenis de for-lus kan starten op event.resultIndex en voeg alleen nieuwe definitieve tekst toe.

Dat is het! De rest van de code is er alleen maar om alles er mooi uit te laten zien. Het behoudt de status, toont de gebruiker enkele informatieve berichten en wisselt het GIF-beeld op de microfoonknop tussen de statische microfoon, het mic-slash-beeld en mic-animate met de pulserende rode stip.

De mic-slash-afbeelding wordt weergegeven wanneer recognition.start() wordt aangeroepen en vervolgens vervangen door mic-animate wanneer onstart wordt geactiveerd. Meestal gebeurt dit zo snel dat de schuine streep niet merkbaar is, maar de eerste keer dat spraakherkenning wordt gebruikt, moet Chrome de gebruiker om toestemming vragen om de microfoon te gebruiken, in welk geval onstart alleen wordt geactiveerd als en als de gebruiker toestemming geeft. Pagina's die op HTTPS worden gehost, hoeven niet herhaaldelijk om toestemming te vragen, terwijl op HTTP gehoste pagina's dat wel doen.

Zorg er dus voor dat uw webpagina's tot leven komen door ze in staat te stellen naar uw gebruikers te luisteren!

Wij horen graag uw feedback...

Raadpleeg de Chrome Privacy Whitepaper voor meer informatie over hoe Google omgaat met spraakgegevens uit deze API.