Нужен код C # для вывода следующего TwiML

Хотите вложить инструкции Say в сборку, но я хочу использовать такие модификаторы, как .Emphasis, .Break и .Prosody, в инструкциях Say. В C #, похоже, нет способа сделать это. Результирующий код TwiML, который мне нужен, будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather action="/voice/processmygather" method="GET">
<Say> Hi
<break strength="x-weak" time="100ms"/>
<emphasis level="moderate">Words to emphasize</emphasis>
<p>Words to speak</p>
<prosody pitch="-10%" rate="85%" volume="-6dB">Words to speak</prosody>
<s>Words to speak</s>
<say-as interpret-as="spell-out">Words to speak</say-as>
<sub alias="alias">Words to be substituted</sub>
<w>Words to speak</w>
</Say>
</Gather>
<Say>We didn't receive any input. Goodbye!</Say>
</Response>

В C # я могу создать объект команды Say и изменить его, чтобы он выглядел, как указано выше, но не могу расположить его как вложенный в сборку, чтобы пользователь мог прервать высказывание ответом и перейти к обработке сборки.

var response = new VoiceResponse();
var mygather = new Gather(input: bothDtmfAndSpeech,
                action: new Uri("/voice/processmygather", UriKind.Relative),
                speechModel: Gather.SpeechModelEnum.NumbersAndCommands,
                enhanced: true,
                hints: hintchoices,
                bargeIn: true,
                speechTimeout: "auto",
                numDigits: 1);
var mysay = new Say("Hi", voice: "Polly.Joanna");
mysay.Break(strength: "x-weak", time: "100ms");
mysay.Emphasis("Words to emphasize", level: "moderate");
mysay.P("Words to speak");
mysay.Phoneme("Words to speak", alphabet: "x-sampa", ph: "pɪˈkɑːn");
mysay.Prosody("Words to speak", pitch: "-10%", rate: "85%", volume: "-6dB");
mysay.SayAs("Words to speak", interpretAs: "spell-out", role: "yyyymmdd");

/* There seems to be no way to do the following command */
response.Append(mygather.mysay);

/* I can only do the following */
response.Append(mysay); // plays the entire say
response.Append(mygather); // only after playing entire say am I able to gather

/* I seem to able to do only the following with limited markup capability */
response.Append(mygather.Say("Here is something I want to say but have little ability to fine tune the say with .Emphasis .Break or .Prosody controls"));

Итак, можно ли просто пометить мой Say со всеми элементами управления, которые я хочу внутри сборки (во многом как в верхнем блоке кода выше), сохранить это в XML-файл, а затем указать объект ответа на этот XML-файл, и все же иметь возможность записывать голосовые или цифровые ответы пользователей в моем приложении C #?


person Curtis Jones    schedule 11.11.2020    source источник
comment
Акдари - Да, как я уже отмечал, у класса Gather есть метод Say. Проблема в том, что у него очень мало методов для формирования объекта Say как глагола Say, на котором, как вы думали, он был основан.   -  person Curtis Jones    schedule 12.11.2020
comment
tychon - я изучу этот метод для сборки и посмотрю, работает ли он.   -  person Curtis Jones    schedule 12.11.2020
comment
tychon - спасибо, метод Append при сборе вроде работает!   -  person Curtis Jones    schedule 12.11.2020
comment
Последний комментарий для потомков. Сборка работала в том смысле, что она включала в себя акцент на разметке и другие теги. Однако он не будет соблюдать тег выделения - и фактически не скажет ничего, что содержит тег выделения. Методом проб и ошибок выяснилось, что любому голосу -neural polly не нравится тег выделения (и, возможно, другие теги формирования голоса). Если вы переключитесь на не нейронный голос, он будет работать должным образом.   -  person Curtis Jones    schedule 12.11.2020
comment
Метод Say принимает объект Say. так что он похож на метод Append, специализирующийся только на теге Say. Итак, вы могли просто сделать myGather.Say(mySay)   -  person Ackdari    schedule 12.11.2020


Ответы (1)


Решил опубликовать ответ для потомков, на случай, если у кого-то возникнет аналогичная проблема на этой странице.

Правильный способ включить объект say в объект сборки:

/* include the marked up mysay object within the mygather object */
mygather.Append(mysay); 

/* speak the marked up mysay twiML while waiting an answer */
response.Append(mygather); 

Другое предостережение заключается в том, что если mysay указал -Neural voice, он не будет воспроизводить некоторые из размеченных тегов, таких как .Emphasis.

В следующей таблице показана совместимость размеченных тегов: https://docs.aws.amazon.com/polly/latest/dg/supportedtags.html

Спасибо пользователю tychon (выше в комментариях под вопросом), который подсказал мне, как найти ответ.

person Curtis Jones    schedule 13.11.2020