Получение XDocument для распознавания встроенного SSML - PullRequest
1 голос
/ 21 марта 2019

Я использую текст в речь, чтобы добавить голос к видео уроку.В настоящее время весь текст находится в файле и читается в приложении C # и разбирается на несколько этапов.То, что я хотел бы сделать, это добавить ssml в текстовый файл, в частности, возможность (приостановить) на протяжении всей конкретной инструкции.Я использую пример кода из Cognitive-Speech-TTS .Этот код использует хороший чистый подход

private string GenerateSsml(string locale, string gender, string name, string text)
    {
        var ssmlDoc = new XDocument(
                          new XElement("speak",
                              new XAttribute("version", "1.0"),
                              new XAttribute(XNamespace.Xml + "lang", "en-US"),
                              new XElement("voice",
                                  new XAttribute(XNamespace.Xml + "lang", locale),
                                  new XAttribute(XNamespace.Xml + "gender", gender),
                                  new XAttribute("name", name),
                                  text)));


        return ssmlDoc.ToString();
    }

. Например, если я установлю для "text" значение

string text = @"During this video we will refer to this as the lens, 
                <break time=""1000ms"" />  this as the headband  
                 <break time=""1000ms"" />, and these as the frame arms 
                <break time=""1000ms"" />. " };
Content = new StringContent(GenerateSsml(inputOptions.Locale, genderValue, inputOptions.VoiceName, text))

, он не распознает встроенный xml.Есть ли способ получить XDocument для распознавания XML в тексте.Обратите внимание, что в фактическом приложении текст заполняется из файла данных.

1 Ответ

0 голосов
/ 21 марта 2019

Вы передаете строку, поэтому LINQ to XML считает, что вы хотите, чтобы это был текстовый узел, экранируя текст соответствующим образом.

Похоже, вы действительно хотите включить несколько узлов - некоторый тексти некоторые элементы.

Я бы предложил изменить GenerateSsml следующим образом:

private string GenerateSsml(string locale, string gender, string name, IEnumerable<XNode> nodes)
{
    var ssmlDoc = new XDocument(
                      new XElement("speak",
                          new XAttribute("version", "1.0"),
                          new XAttribute(XNamespace.Xml + "lang", "en-US"),
                          new XElement("voice",
                              new XAttribute(XNamespace.Xml + "lang", locale),
                              new XAttribute(XNamespace.Xml + "gender", gender),
                              new XAttribute("name", name),
                              nodes)));
    return ssmlDoc.ToString();
}

Затем измените метод вызова на:

var nodes = new XNode[]
{
    new XText("During this video we will refer to this as the lens,"),
    new XElement("break", new XAttribute("time", "1000ms")),
    new XText(" this as the headband"),
    new XElement("break", new XAttribute("time", "1000ms")),
    new XText(", and these as the frame arms"),
    new XElement("break", new XAttribute("time", "1000ms"))
    new XText("."),
};
Content = new StringContent(
    GenerateSsml(inputOptions.Locale, genderValue, inputOptions.VoiceName, nodes));

Если вывы действительно хотите использовать строковое представление вместо этого, вы могли бы написать:

string text = ...; // Code as before
var element = XElement.Parse($"<root>{text}</root>");
Content = new StringContent(
    GenerateSsml(inputOptions.Locale, genderValue, inputOptions.VoiceName, element.Nodes()));
...