先日書いたコードがiOSのSafariで上手く動きませんでした。
子供向けなのでiPhoneまたはiPadで音声が再生されないと困ります。 いろいろ調べたけれど、JavaScriptから呼び出す方法がわからないので 勝手知ったるJavaの世界に取り込んでiOSのSafariでも音声が再生されるようにしました。
下記がそのコードです。
@Path("/tts")
public class TTSResource
{
@GET
@Produces("audio/mpeg")
public Response textToSpeech(@QueryParam("text") String text) throws IOException
{
final URL url = new URL("http://translate.google.com/translate_tts?tl=en&q=" + text);
final URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla");
return Response.ok(connection.getInputStream()).build();
}
}
JAX-RSでGoogle Translateの結果をそのままレスポンスとして返すようにしています。 User-Agentを指定していないと上手く動きません。 ここで気がついたのですがUser-Agentで振る舞いが変わるようなので、 もしかしたらiOSからのアクセスの場合にもUser-Agentを偽装できれば音声が再生されるのかもしれないです。
先日の記事にも書きましたがクライアント側(javaScript)は下記のようになります。
<h:outputScript>
function play() {
var voice = new Audio();
voice.src = "${request.contextPath}/rest/tts?text=one";
voice.play();
}
</h:outputScript>
<a href="javascript:play()">音声</a>