让 XDocument 识别嵌入式 SSML

Getting XDocument to recognize embedded SSML

我正在使用文字转语音功能为视频教程添加语音。目前,所有文本都在一个文件中,并被读入 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。请注意,在实际应用程序中,文本是从数据文件中填充的。

您正在传递一个字符串,因此 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()));