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 が返されました&amp;Twilio が にデコードしないように見え&ます。

2) Google の出力をサーバー上のファイルに保存し、このファイルへの直接リンク (& なし) をタグ付けします。動作するはずですが、汚いハックのように見えます =)

4

3 に答える 3

2

わかりました、私はこの問題を3番目の方法で解決しました:

このサーブレット内に、Google TTS エンジンに必要なすべてのパラメーターを隠すための「プロキシ」サーブレットを作成しました。コードで示す方が簡単です。

プロキシ サーブレットへの URL (代わりに Google TTS エンジンへの URL) を TwiML に配置しました。このサーブレットに必要なパラメーターは 1 つだけです。それは、再生されるメッセージです。この場合、TwiML ではアンパサンド記号を使用しません。

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

これはプロキシ サーブレットです (/tts/ パスにマップされます)。Google TTS エンジンにリクエストを送信し、レスポンスを返します。

...
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 がこれを処理できない場合は、Twilio に対してバグを報告する必要があります。

于 2014-12-15T12:39:32.517 に答える