Ses temelli web uygulamaları - Web Speech API'ye Giriş

Yeni JavaScript Web Speech API, web sayfalarınıza konuşma tanıma özelliğini eklemeyi kolaylaştırır. Bu API, Chrome 25 ve sonraki sürümlerdeki konuşma tanıma özellikleri üzerinde hassas kontrol ve esneklik sağlar. Aşağıda, tanınan metnin konuşurken neredeyse anında göründüğü bir örnek verilmiştir.

Web Speech API demosu

DEMO / SOURCE

Şimdi işin mutfağını inceleyelim. Öncelikle, webkitSpeechRecognition nesnesinin var olup olmadığını kontrol ederek tarayıcının Web Speech API'yi destekleyip desteklemediğini kontrol ederiz. Aksi takdirde kullanıcının tarayıcısını yükseltmesini öneririz. (API hâlâ deneysel olduğu için şu anda tedarikçi firma ön eklidir.) Son olarak, konuşma arayüzünü sağlayan webkitSpeechRecognition nesnesini oluşturup bazı özelliklerini ve etkinlik işleyicilerini ayarlarız.

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

continuous için varsayılan değer false'tır. Bu, kullanıcı konuşmayı bıraktığında konuşma tanımanın sona ereceği anlamına gelir. Bu mod, kısa giriş alanları gibi basit metinler için idealdir. Bu demo'da, kullanıcı konuşurken duraklatsa bile tanıma işleminin devam etmesi için bu ayarı doğru olarak belirledik.

interimResults için varsayılan değer yanlıştır. Bu, tanımlayıcı tarafından döndürülen tek sonuçların nihai olduğu ve değişmeyeceği anlamına gelir. Demoda bu değer doğru olarak ayarlanır. Böylece, değişebilecek erken dönem ara sonuçlar elde ederiz. Demoyu dikkatlice izleyin. Gri metin, geçici olan ve bazen değişen metindir. Siyah metin ise tanımlayıcıdan gelen, nihai olarak işaretlenmiş ve değişmeyecek yanıtlardır.

Kullanıcı, mikrofon düğmesini tıklayarak aşağıdaki kodu tetikler:

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

Konuşma tanımlayıcı "lang" için konuşulan dili, kullanıcının seçim açılır listesi aracılığıyla seçtiği BCP-47 değerine (ör. ABD İngilizcesi için "en-US") ayarlarız. Bu ayarlanmazsa varsayılan olarak HTML dokümanı kök öğesinin ve hiyerarşisinin lang değeri kullanılır. Chrome konuşma tanıma, birçok dili (demo kaynağındaki "langs" tablosuna bakın) ve bu demoya dahil edilmeyen bazı sağdan sola yazılan dilleri (ör. he-IL ve ar-EG) destekler.

Dili ayarladıktan sonra konuşma tanımayı etkinleştirmek için recognition.start() çağrılır. Ses yakalamaya başladığında onstart etkinlik işleyicisini, ardından her yeni sonuç grubu için onresult etkinlik işleyicisini çağırır.

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

Bu işleyici, şu ana kadar alınan tüm sonuçları iki dize halinde birleştirir: final_transcript ve interim_transcript. Elde edilen dizeler "\n" içerebilir (ör. kullanıcı "yeni paragraf" dediğinde). Bu nedenle, bunları HTML etiketleri <br> veya <p>'ye dönüştürmek için linebreak işlevini kullanırız. Son olarak bu dizeleri, karşılık gelen <span> öğelerinin innerHTML olarak ayarlar: final_span siyah metinle, interim_span ise gri metinle biçimlendirilir.

interim_transcript yerel bir değişkendir ve son onresult etkinliğinden bu yana tüm ara sonuçların değişmiş olması mümkün olduğundan bu etkinlik her çağrıldığında tamamen yeniden oluşturulur. Aynısını final_transcript için de yapabiliriz. Bunun için for döngüsünü 0'dan başlatmamız yeterlidir. Ancak nihai metin hiçbir zaman değişmediğinden, final_transcript değerini global yaparak buradaki kodu biraz daha verimli hale getirdik. Böylece bu etkinlik, for döngüsünü event.resultIndex değerinde başlatabilir ve yalnızca yeni nihai metni ekler.

Hepsi bu kadar! Kodun geri kalanı, her şeyin güzel görünmesi içindir. Durumu korur, kullanıcıya bazı bilgilendirici mesajlar gösterir ve mikrofon düğmesindeki GIF resmini statik mikrofon, mikrofon-eğik çizgi resmi ve mikrofon-animasyonlu titreşen kırmızı nokta arasında değiştirir.

recognition.start() çağrıldığında mikrofon eğik çizgi resmi gösterilir ve ardından onstart tetiklendiğinde mikrofon animasyonu resmiyle değiştirilir. Bu işlem genellikle o kadar hızlı gerçekleşir ki eğik çizgi fark edilmez. Ancak konuşma tanıma özelliği ilk kez kullanıldığında Chrome'un mikrofonu kullanmak için kullanıcıdan izin alması gerekir. Bu durumda onstart yalnızca kullanıcı izin verdiğinde tetiklenir. HTTPS'de barındırılan sayfaların tekrar tekrar izin istemesi gerekmez. HTTP'de barındırılan sayfaların ise tekrar tekrar izin istemesi gerekir.

Bu nedenle, web sayfalarınızın kullanıcılarınızı dinlemesini sağlayarak canlanmasını sağlayın.

Geri bildiriminizi öğrenmekten memnuniyet duyarız...

Google'ın bu API'den gelen ses verilerini nasıl işlediğini öğrenmek için Chrome Gizlilik Raporu'na bakın.