1

我想在 Twilio 中使用 Google Text-To-Speech 服务。

我生成了带有几个参数的 URL,用 & 分隔。
例如:http ://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20World&tl=en-us

问题是:当我尝试将此 URL 放入 TwiML 标记中时,出现以下异常:

文档第 1 行错误:对实体“q”的引用必须以“;”结尾 分隔符。请确保响应正文是有效的 XML 文档。

这是 TwiML:

<Response>
    <Play>http://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20World&tl=en-us</Play>
</Response>

我已经尝试过的解决方案:

1)替换&它对&amp;
我没有帮助。在这种情况下,我遇到了另一个异常:返回了 HTTP 状态代码 404。看起来 Twilio 没有解码&amp;&.

2) 将 Google 输出保存到服务器上的文件,并将指向该文件的直接链接(不带任何 &)添加到标记中。它应该可以工作,但它看起来像肮脏的黑客=)

4

3 回答 3

2

好的,我通过第三种方式解决了这个问题:

我制作了“代理”servlet,用于在这个 servlet 中隐藏 google TTS Engine 所需的所有参数。在代码中演示更容易:

我将代理 servlet 的 URL(而不是 Google TTS 引擎的 URL)放到 TwiML 中。对于这个 servlet,只需要一个参数:将播放的消息。在这种情况下,我避免在 TwiML 中使用 & 符号。

...
String url = Constants.APPLICATION_URL + "/tts/" +"?" + Constants.ParamName.GREETINGS + "=" + greetings;
Play play = new Play(url);
...

这是代理 servlet(它映射到 /tts/ 路径)。向 Google TTS Engine 发出请求并从它发回响应:

...
this.greetings = request.getParameter(Constants.ParamName.GREETINGS);
InputStream input = null;
HttpURLConnection con = null;
OutputStream output = null;
try {
    URL obj = new URL("http://translate.google.com/translate_tts?ie=UTF-8&q=" + URLEncoder.encode(greetings, "UTF-8") + "&tl=en-us"));
    con = (HttpURLConnection) obj.openConnection();
    con.setConnectTimeout(5000);
    con.setRequestMethod("GET");
    con.setRequestProperty("User-Agent", "Mozilla/5.0");
    con.setRequestProperty("Content-Type", "audio/mpeg");
    input = con.getInputStream();
    response.setContentType("audio/mpeg");
    output = response.getOutputStream();
    byte[] buffer = new byte[10240];
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
}
...

当然,这看起来像一个肮脏的黑客,但我认为这比在服务器上保存临时文件要好。

于 2014-12-24T17:41:44.777 回答
1

在此处发布此内容以防对其他人有用。我编写了一个开源示例应用程序,它将来自 Google Cloud Text-To-Speech API 的录音存储到 Google Cloud Storage。响应是录音的 URL,可以传递给<Play>TwiML 动词。

如果您希望以 Google 支持但 Twilio 不支持的语言使用 TTS,此应用程序可能会有所帮助。截至 2019 年 12 月,这些语言包括:

  • 阿拉伯
  • 捷克语
  • 菲律宾人
  • 希腊语
  • 匈牙利
  • 印度尼西亚
  • 斯洛伐克语
  • 乌克兰
  • 越南语

此支持文章提供了 Twilio Text-to-Speech 支持的语言列表。

于 2019-12-17T02:28:15.920 回答
0
<Response>
    <Play>http://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20World&tl=en-us</Play>
</Response>

是语法无效的 XML。这没关系:

<Response>
    <Play>http://translate.google.com/translate_tts?ie=UTF-8&amp;q=Hello%20World&amp;tl=en-us</Play>
</Response>

如果 Twilio 无法处理此问题,那么您应该针对他们提交错误。

于 2014-12-15T12:39:32.517 回答