Aplikacje internetowe na podstawie głosu – wprowadzenie do interfejsu Web Speech API

Nowy interfejs JavaScript Web Speech API ułatwia dodawanie rozpoznawania mowy do stron internetowych. Ten interfejs API umożliwia dokładne i elastyczne zarządzanie funkcjami rozpoznawania mowy w Chrome w wersji 25 i nowszych. Oto przykład rozpoznawania tekstu, który pojawia się niemal natychmiast podczas mówienia.

Demonstracja Web Speech API

DEMO / SOURCE

Przyjrzyjmy się temu bliżej. Najpierw sprawdzamy, czy przeglądarka obsługuje interfejs Web Speech API, sprawdzając, czy istnieje obiekt webkitSpeechRecognition. W przeciwnym razie zalecamy użytkownikowi zaktualizowanie przeglądarki. (interfejs API jest wciąż w fazie eksperymentalnej, dlatego ma obecnie prefiks dostawcy). Na koniec tworzymy obiekt webkitSpeechRecognition, który udostępnia interfejs mowy, oraz ustawiamy niektóre jego atrybuty i obsługi zdarzeń.

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() { ... }
    ...

Domyślna wartość parametru continuous to „fałsz”, co oznacza, że rozpoznawanie mowy zostanie zakończone, gdy użytkownik przestanie mówić. Ten tryb jest idealny do prostego tekstu, np. krótkich pól wprowadzania danych. W tym demo ustawiamy tę opcję na „Prawda”, aby rozpoznawanie kontynuowało nawet wtedy, gdy użytkownik zatrzyma się w mowie.

Wartość domyślna dla interimResults to fałsz, co oznacza, że jedyne wyniki zwrócone przez rozpoznawacz są ostateczne i nie ulegną zmianie. W wersji demonstracyjnej jest on ustawiony na wartość true, abyśmy mogli uzyskać wstępne wyniki, które mogą się zmienić. Uważnie obejrzyj demonstrację. Szary tekst to tekst tymczasowy, który może się czasem zmieniać, a czarny tekst to odpowiedzi rozpoznawacza, które są oznaczone jako ostateczne i nie ulegną zmianie.

Aby rozpocząć, użytkownik klika przycisk mikrofonu, który uruchamia ten kod:

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

Język mowy dla rozpoznawacza mowy „lang” ustawiamy na wartość BCP-47 wybraną przez użytkownika na liście rozwijanej, np. „pl-PL” dla języka polskiego. Jeśli ta wartość nie jest ustawiona, przyjmuje domyślnie język elementu katalogu i hierarchii dokumentu HTML. Rozpoznawanie mowy w Chrome obsługuje wiele języków (patrz tabela „langs” w źródle demonstracji), a także niektóre języki zapisywane od prawej do lewej, które nie są uwzględnione w tym demonstratorze, np. he-IL i ar-EG.

Po ustawieniu języka wywołujemy funkcję recognition.start(), aby aktywować rozpoznawanie mowy. Gdy rozpocznie rejestrowanie dźwięku, wywołuje metodę obsługi zdarzenia onstart, a następnie dla każdego nowego zbioru wyników wywołuje metodę obsługi zdarzenia onresult.

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);
    };
}

Ten moduł konkatenuje wszystkie otrzymane do tej pory wyniki w 2 ciągi znaków: final_transcriptinterim_transcript. Wygenerowane ciągi znaków mogą zawierać znak "\n", np. gdy użytkownik wypowiada „nowy akapit”, dlatego używamy funkcji linebreak, aby przekonwertować je na tagi HTML <br> lub <p>. Na koniec ustawia te ciągi znaków jako innerHTML odpowiadających im elementów <span>: final_span, który ma styl tekstu czarnego, i interim_span, który ma styl tekstu szarego.

interim_transcript to zmienna lokalna, która jest całkowicie odtwarzana za każdym razem, gdy to zdarzenie jest wywoływane, ponieważ możliwe, że wszystkie wyniki pośrednie zmieniły się od czasu ostatniego zdarzenia onresult. Możemy zrobić to samo w przypadku final_transcript, po prostu rozpoczynając pętlę for od 0. Ponieważ jednak tekst końcowy nigdy się nie zmienia, kod jest nieco bardziej wydajny, ponieważ zmienna final_transcript jest zmienną globalną, co pozwala temu zdarzeniu uruchomić pętlę for w miejscu event.resultIndex i tylko dołączyć nowy tekst końcowy.

To wszystko. Pozostała część kodu służy tylko do tego, aby wszystko wyglądało ładnie. Utrzymuje stan, wyświetla użytkownikowi kilka komunikatów informacyjnych i zamienia obraz GIF na przycisku mikrofonu między stałym mikrofonem, obrazem mikrofonu z przekreślonym mikrofonem i animowanym mikrofonem z pulsującą czerwoną kropką.

Obraz z przekreślonym mikrofonem wyświetla się, gdy wywołana zostanie funkcja recognition.start(), a następnie zastąpiona animacją mikrofonu, gdy zostanie wywołana funkcja onstart. Zwykle dzieje się to tak szybko, że użytkownik nie zauważa tego znaku, ale gdy po raz pierwszy korzysta z rozpoznawania mowy, Chrome musi poprosić go o zezwolenie na użycie mikrofonu. W tym przypadku zdarzenie onstart jest wywoływane tylko wtedy, gdy użytkownik wyrazi zgodę. Strony hostowane w protokole HTTPS nie muszą wielokrotnie prosić o pozwolenie, podczas gdy strony hostowane w protokole HTTP muszą.

Spraw, aby Twoje strony internetowe ożyły, umożliwiając im słuchanie użytkowników.

Chętnie poznamy Twoją opinię...

Aby dowiedzieć się, jak Google zarządza danymi głosowymi z tego interfejsu API, przeczytaj dokument na temat ochrony prywatności w Chrome.