Преобразование текста в речь с помощью SAPI: пользовательский язык

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

Моя ОС по умолчанию использует греческий и английский языки, и у меня установлен SAPI SDK; Греческий язык поддерживается SAPI.

Проблема в том, что SAPI не распознает автоматически переданный ему язык и возвращается к произнесению отдельных букв одну за другой.

Вот код, который я использую, с английским текстом:

using SpeechLib;

SpVoice voice = new SpVoice();
voice.Speak("Pdf File Successfully Installed", SpeechVoiceSpeakFlags.SVSFlagsAsync);
voice.WaitUntilDone(30000);

Это работает, но когда я передаю греческий текст в функцию (например, "Να ενα κειμενο"), я вижу, что возникает проблема.


person Captain Lemon    schedule 20.04.2015    source источник
comment
Значит, у вас проблемы с преобразованием текста в речь, а не с распознаванием?   -  person James Thorpe    schedule 20.04.2015
comment
@JamesThorpe Я действительно не знаю, чья вина ..:/   -  person Captain Lemon    schedule 20.04.2015
comment
Вы можете использовать Speech XML, чтобы отметить встроенные языки...   -  person Ben    schedule 20.04.2015
comment
В качестве альтернативы вы можете установить голос на греческий голос.   -  person Ben    schedule 20.04.2015
comment
@Ben Спасибо за ответ, Бен .. Можете ли вы объяснить подробнее, как я могу это сделать?   -  person Captain Lemon    schedule 20.04.2015
comment
@CaptainLemon Я переформулировал ваш вопрос, чтобы уточнить, что он касается преобразования текста в речь - не стесняйтесь отредактировать или отменить его, если я сделал это неправильно.   -  person James Thorpe    schedule 21.04.2015
comment
Я не верю, что Microsoft поставляет греческий голос TTS в Windows. Когда вы говорите, что греческий язык поддерживается SAPI, что вы имеете в виду?   -  person Eric Brown    schedule 22.04.2015


Ответы (1)


Вы можете установить язык, передав SSML в Speak API и включив атрибут xml:lang.

Например, это должно работать:

SpVoice voice = new SpVoice();
voice.Speak(
"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='el-GR'>"
+ "Να ενα κειμενο"
+ "</speak>",
 SpeechVoiceSpeakFlags.SVSFlagsAsync|SpeechVoiceSpeakFlags.SVSFIsXML);
voice.WaitUntilDone(30000);

Вы также можете переключать язык в середине речи. В документации есть такой пример:

<speak version="1.0"
   xmlns="http://www.w3.org/2001/10/synthesis"
  xml:lang="en-US">

   For English, press 1.

   <voice xml:lang="fr-FR" gender="female"> 
   Pour le français, appuyez sur 2 </voice>

</speak>

Подробнее см. здесь:

person Ben    schedule 21.04.2015
comment
Большое спасибо, Ben.Solution 1 кажется довольно хорошим, но я получаю сообщение об ошибке при попытке запустить его. - person Captain Lemon; 21.04.2015
comment
Вам не хватает закрывающего тега </speak> - person Ben; 21.04.2015
comment
О, я такой свалка .. Я попробую, и я скоро отвечу! - person Captain Lemon; 21.04.2015
comment
Как я видел на сайте Microsoft, могу ли я использовать Lang ID в SSML? Изменяется ли тег xml:lang=el-GR. Например, вместо el-GR я буду использовать 408 (греч. Id lang) ? - person Captain Lemon; 21.04.2015
comment
Извините, да, это должен быть el или, может быть, el-GR, а не gr-GR. Я не знаю, можете ли вы использовать 408, извините. - person Ben; 21.04.2015