Правильный способ использования SSML с API веб-речи
спецификация API веб-речи говорит:
текст атрибут
Этот атрибут определяет синтезируемый текст и сказано для этого высказывания. Это может быть либо обычный текст, либо полный, хорошо сформированный документ SSML. Для синтеза речи которые не поддерживают SSML или поддерживают только определенные теги, пользователь агент или речевой движок должны удалить теги, которые они не поддерживают и говорить текст.
он не предоставляет пример использования text
С документом SSML.
я попробовал следующее В Chrome 33:
var msg = new SpeechSynthesisUtterance();
msg.text = '<?xml version="1.0"?>rn<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">ABCD</speak>';
speechSynthesis.speak(msg);
это не сработало-голос попытался рассказать теги XML. Этот код действителен?
Должен ли я предоставить XMLDocument
объект вместо этого?
Я пытаюсь понять, нарушает ли Chrome спецификацию (которая должна быть сообщена как ошибка), или мой код недействителен.
2 ответов
в Chrome 46 XML правильно интерпретируется как XML-документ в Windows, когда язык установлен в en
; однако я не вижу никаких доказательств того, что теги действительно что-то делают. Я не слышал никакой разницы между <emphasis>
и не<emphasis>
версии этого SSML:
var msg = new SpeechSynthesisUtterance();
msg.text = '<?xml version="1.0"?>\r\n<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US"><emphasis>Welcome</emphasis> to the Bird Seed Emporium. Welcome to the Bird Seed Emporium.</speak>';
msg.lang = 'en';
speechSynthesis.speak(msg);
на <phoneme>
тег также был полностью проигнорирован, что сделало мою попытку говорить IPA неудачной.
var msg = new SpeechSynthesisUtterance();
msg.text='<?xml version="1.0" encoding="ISO-8859-1"?> <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis/synthesis.xsd" xml:lang="en-US"> Pavlova is a meringue-based dessert named after the Russian ballerina Anna Pavlova. It is a meringue cake with a crisp crust and soft, light inside, usually topped with fruit and, optionally, whipped cream. The name is pronounced <phoneme alphabet="ipa" ph="pævˈloʊvə">...</phoneme> or <phoneme alphabet="ipa" ph="pɑːvˈloʊvə">...</phoneme>, unlike the name of the dancer, which was <phoneme alphabet="ipa" ph="ˈpɑːvləvə">...</phoneme> </speak>';
msg.lang = 'en';
speechSynthesis.speak(msg);
это несмотря на то, что API речи Microsoft тут правильно обрабатывать SSML. Вот фрагмент C#, подходящий для использования в помощью linqpad:
var str = "Pavlova is a meringue-based dessert named after the Russian ballerina Anna Pavlova. It is a meringue cake with a crisp crust and soft, light inside, usually topped with fruit and, optionally, whipped cream. The name is pronounced /pævˈloʊvə/ or /pɑːvˈloʊvə/, unlike the name of the dancer, which was /ˈpɑːvləvə/.";
var regex = new Regex("/([^/]+)/");
if (regex.IsMatch(str))
{
str = regex.Replace(str, "<phoneme alphabet=\"ipa\" ph=\"\">word</phoneme>");
str.Dump();
}
SpeechSynthesizer synth = new SpeechSynthesizer();
PromptBuilder pb = new PromptBuilder();
pb.AppendSsmlMarkup(str);
synth.Speak(pb);