Изменение речиСинтез голоса с помощью SpeechRecognition

Я использую SpeechRecognition со своим микрофоном и получаю данные, переданные мне с помощью speechSynthesis.

Я сделал голос женским при загрузке страницы и хочу иметь возможность переключиться на мужской голос, сказав «мужской голос», который затем передаст «Я теперь мужчина». Я также позже хочу иметь возможность сделать обратное - когда он настроен на мужской голос, скажите «женский голос», и он переключится обратно.

В настоящее время я могу это сделать, но мужской голос будет произнесен только один раз, так как голос не сохраняется, а передается только как аргумент. Следовательно, следующее, что будет сказано, будет снова женским голосом:

let voices = [];
window.speechSynthesis.onvoiceschanged = function() {
  voices = window.speechSynthesis.getVoices();
};

function loadVoices(message, voice) {
  const msg = new SpeechSynthesisUtterance();
  msg.voice = voice || voices[48]; // female voice
  msg.text = message;
  speechSynthesis.speak(msg);
};

// asking for voice change here
  if (transcript.includes('male voice')) {
    let message = ('I am now a man');
    let voice = voices[50]; // male voice
    loadVoices(message, voice);
  }

Я попытался использовать глобальную переменную так, что msg.voice указывает на глобальную переменную, но это не работает, плюс голос возвращается к умолчанию (электронный голос):

let voiceGender = voices[48];
function loadVoices(message) {
  const msg = new SpeechSynthesisUtterance();
  msg.voice = voiceGender // now a variable pointing to another.
  msg.text = message;
  speechSynthesis.speak(msg);
};

  if (transcript.includes('male voice')) {
    let message = ('I am now a man');
    let voiceGender = voices[50]; // changing the global variable
    loadVoices(message);
  }

Если я объявлю voiceGender внутри loadVoices(), то я не смогу изменить его с if, который находится внутри другой функции.

Как я могу настроить структуру Javascript, чтобы добиться этого?


person Maxime Dore    schedule 31.08.2017    source источник


Ответы (1)


Я решил это, добавив функцию и логическое значение с условными выражениями в функцию loadVoices, чтобы:

// on pageload the voice is set to a female voice
let femaleVoice = true;

function loadVoices(message) {
  const msg = new SpeechSynthesisUtterance();

  // checks the boolean
  if (femaleVoice) {
    msg.voice = voices[48];
  } else {
    msg.voice = voices[50];
  }

  msg.text = message;
  speechSynthesis.speak(msg);
};

// changes the boolean / changes the gender of the SpeechSynthesisUtterance voice
function changeVoice() {
  if (femaleVoice) {
    femaleVoice = false;
  } else {
    femaleVoice = true;
  }
}

if (transcript.includes('male voice') || transcript.includes('female voice') ) {
  // calls the function to change the boolean.
  changeVoice();

  let message = ('I now have a different voice');
  loadVoices(message);
}

Он добавляет немного больше строк, чем изначально хотел, но определенно работает.

person Maxime Dore    schedule 06.09.2017