18

Tôi đang sử dụng Speech Synthesis API trên Google Chrome v34.0.1847.131. API được triển khai trong Chrome bắt đầu từ phiên bản v33.SpeechSynthesis API gửi lại gọi lại không hoạt động

Tính năng chuyển văn bản thành giọng nói hoạt động nhiều nhất, trừ khi chỉ định gọi lại đến onend. Ví dụ: mã sau:

var message = window.SpeechSynthesisUtterance("Hello world!"); 
message.onend = function(event) { 
    console.log('Finished in ' + event.elapsedTime + ' seconds.'); 
}; 
window.speechSynthesis.speak(message); 

đôi khi sẽ gọi onend và đôi khi không gọi nó. Thời gian dường như hoàn toàn tắt. Khi được gọi, số elapsedTime được in luôn luôn là một số thời điểm thời gian như 1399237888.

+0

chỉ vì thông số được viết tại w3 ... không có nghĩa là chúng hoạt động hoặc hoạt động chính xác như vậy trong tất cả các trình duyệt, đặc biệt nếu chúng là mới và thử nghiệm như thuyết minh..không phải là khả năng này là một bước đột phá công nghệ mà là lần đầu tiên được đưa tới trình duyệt. –

+0

Tôi đã kiểm tra những gì bạn đang làm và có vấn đề tồn tại ... đối với tôi về sự kiện kết thúc đã không bị sa thải dù chỉ một lần ... và đôi khi cũng bị lỡ. –

+1

Cảm ơn bạn đã kiểm tra. Đó là khuyến khích để xem ai đó với vấn đề này. Tôi đoán điều này có thể chỉ là một triển khai nửa nướng, vì vậy câu hỏi này có thể không có câu trả lời. – huu

Trả lời

6

Trong khi đây là cách tôi tìm thấy nó để làm cho nó làm việc, tôi không chắc chắn nếu điều này là hành vi đúng ....

Đầu tiên không gọi hàm speak nó ngay lập tức, sử dụng gọi lại.

Thứ hai, để sử dụng thời gian timeStamp thay vì elapsedTime. Bạn có thể vừa sử dụng performance.now().

var btn = document.getElementById('btn'); 
speechSynthesis.cancel() 
var u = new SpeechSynthesisUtterance(); 
u.text = "This text was changed from the original demo."; 

var t; 
u.onstart = function (event) { 
    t = event.timeStamp; 
    console.log(t); 
}; 

u.onend = function (event) { 
    t = event.timeStamp - t; 
    console.log(event.timeStamp); 
    console.log((t/1000) + " seconds"); 
}; 

btn.onclick = function() {speechSynthesis.speak(u);}; 

Demo: http://jsfiddle.net/QYw6b/2/

bạn nhận được thời gian trôi qua và cả hai sự kiện sa thải vì chắc chắn.

4

Bạn có thể sử dụng EventListener để bắt đầu và kết thúc như tôi đã làm cho Speakerbot (http://www.speakerbot.de/).

Tại đây mặt tôi thay đổi khi từ được nói.

newUtt = new SpeechSynthesisUtterance(); 

newUtt.addEventListener('start', function() { 
    console.log('started'); 
}) 

newUtt.addEventListener('end', function() { 
    console.log('stopped'); 
}) 
3

Tôi tìm thấy cả hai giải pháp được đề xuất ở đây không hoạt động trong an app I just wrote. Giải pháp duy nhất tôi có thể đưa ra là một (loại) bận rộn chờ đợi:

function speak(text, onend) { 
    window.speechSynthesis.cancel(); 
    var ssu = new SpeechSynthesisUtterance(text); 
    window.speechSynthesis.speak(ssu); 
    function _wait() { 
    if (! window.speechSynthesis.speaking) { 
     onend(); 
     return; 
    } 
    window.setTimeout(_wait, 200); 
    } 
    _wait(); 
} 

bạn có thể tìm thấy một ví dụ hoàn chỉnh trong this codepen

0

Tôi cũng thấy cách duy nhất để làm cho công việc này chắc chắn là sử dụng .cance. Tôi sử dụng thời gian chờ 17 giây. Tất cả các bản thu âm của tôi đều dưới 20 giây nên nó hoạt động cho tôi.

utterance.onstart = function (event) { 
setTimeout(function(){window.speechSynthesis.cancel();},17000); 
}; 

Trước khi tôi gặp sự cố này sau mỗi 8-10 tin nhắn đã thử. Khi tôi thêm vào .cancel, nó dường như luôn hoạt động. Tôi cũng gọi thiết lập thời gian chờ khi gọi.

setTimeout(function(){window.speechSynthesis.speak(utterance);},100); 
3

này trông giống như một lỗi Chromium báo cáo on Jul 12, 2015.

Issue 509488: Web Speech API: 'kết thúc' sự kiện của đối tượng SpeechSynthesisUtterance không cử đôi khi

14

Theo this comment về lỗi được đề cập trong số the answer từ Kevin Hakanson, có thể đó là vấn đề với thu gom rác thải.Lưu trữ các lời nói trong một biến trước khi gọi speakseems to do the trick:

window.utterances = []; 
var utterance = new SpeechSynthesisUtterance('hello'); 
utterances.push(utterance); 
speechSynthesis.speak(utterance); 
+2

Cảm ơn vì điều này! Sau khi tôi thay đổi phạm vi biến ngôn ngữ của tôi, tôi không còn gặp vấn đề nữa. Tôi đồng ý rằng có thể có một lỗi liên quan đến GC nội bộ của trình duyệt. – vbguyny

+0

Đã hoạt động! Để làm rõ cho người mới bắt đầu như tôi, làm cho phạm vi của biến 'SpeechSynthesisUtterance' rộng hơn, ví dụ: toàn cầu, không phải là lừa. – Andras

1

in những lời nói trước khi nói chuyện dường như làm việc ... Nếu tôi loại bỏ các giao diện điều khiển, vấn đề này sẽ xảy ra, không biết lý do tại sao

console.log("utterance", utterThis); 
synth.speak(utterThis); 
Các vấn đề liên quan