7

Tôi đã sử dụng API tổng hợp giọng nói mới trong Chrome (33 trở lên) để tạo hỗ trợ giao tiếp dựa trên web. Tôi muốn người dùng có thể thay đổi giọng nói giữa nam và nữ, API cho phép tôi thực hiện. Tuy nhiên, khi trang được tải lần đầu tiên và lần đầu tiên chức năng được chạy (từ sự kiện onclick), nó sử dụng giọng nữ mặc định. Sau đó, bất cứ lúc nào nó được chạy sau đó, nó sử dụng giọng nam mà tôi đang cố gắng sử dụng. Làm thế nào tôi có thể làm cho giọng nam giới chạy lần đầu tiên?Tại sao giọng nói của API Tổng hợp giọng nói của tôi thay đổi khi chức năng chạy hơn 1 lần?

Đây là nút mà các cuộc gọi javascript:

<button type="button" name="speakMe"id="speakMe" onclick="speakPhrase($('phraseBar').getValue());" ><img src="images/speakMe.png" /></button> 

Và đây là chức năng speakPhrase đang được gọi là:

function speakPhrase(phrase) { 
    if(phrase =="") 
    { 
     alert("Please enter a phrase before asking me to speak for you. Thank you!"); 
    } 
    else 
    { 
     var speech = new SpeechSynthesisUtterance(phrase); 
     var voices = window.speechSynthesis.getVoices(); 
     speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0]; 
     window.speechSynthesis.speak(speech); 

    } 
} 

bất cứ ai có thể giúp đỡ?

Trả lời

0

Bằng một chút may mắn tôi được quản lý để giải quyết vấn đề này bằng cách thiết lập thuộc tính mặc định là false trước khi thiết lập giọng

function speakPhrase(phrase) { 
    if(phrase =="") 
    { 
     alert("Please enter a phrase before asking me to speak for you. Thank you!"); 
    } 
    else 
    { 
     var speech = new SpeechSynthesisUtterance(phrase); 
     var voices = window.speechSynthesis.getVoices(); 
     speech.default = false; 
     speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0]; 
     speech.lang = 'en-GB'; //Also added as for some reason android devices used for testing loaded spanish language 
     window.speechSynthesis.speak(speech); 
    } 
} 
+0

cùng một vấn đề. Không làm việc cho tôi. – agoldev

+0

Vấn đề là dễ dàng để xem nếu bạn console.log giọng nói sau khi cuộc gọi đầu tiên. onVoicesThay đổi cập nhật ngay sau khi chúng thực sự có sẵn. –

7

Dường như mảng tiếng nói là trống trên cuộc gọi đầu tiên. Từ những gì tôi đọc nó có một cái gì đó để làm với một cuộc gọi không đồng bộ để tải các giọng nói. Vì vậy, nó luôn luôn trống rỗng lần đầu tiên nó được gọi là. Đối với tôi, điều này đã làm điều kỳ diệu:

var speech_voices; 
if ('speechSynthesis' in window) { 
    speech_voices = window.speechSynthesis.getVoices(); 
    window.speechSynthesis.onvoiceschanged = function() { 
    speech_voices = window.speechSynthesis.getVoices(); 
    }; 
} 

Gọi từ đâu đó bên ngoài chức năng nói của bạn.

0

Tôi đã giải quyết được sự cố.

Nguyên nhân gốc: Khi bạn gọi API lần đầu tiên, giọng nói không tải vì một lý do nào đó. Và tải giọng nói mặc định lần đầu tiên.

SO tôi đã thêm bên dưới dòng mã tại tải trang hoặc bắt đầu hoặc trạng thái sẵn sàng mà thậm chí trước khi mã của tôi được gọi:

voices = window.speechSynthesis.getVoices(); 

Đó giải quyết vấn đề của tôi, hy vọng giúp những người khác.

0

Câu trả lời được cập nhật. Đây là công trình cho tôi.

$(window).load(function(){ voices = window.speechSynthesis.getVoices(); }) 
Các vấn đề liên quan