1

我正在使用文本到语音向视频教程添加语音。目前,所有文本都在一个文件中,并被读入 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();
    }

例如,如果我将“文本”设置为

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。请注意,在实际应用程序中,文本是从数据文件中填充的。

4

1 回答 1

1

您正在传递一个字符串,因此 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()));
于 2019-03-21T19:03:35.153 回答