音声合成を使ってみる

# **合成音声サービス・製品まとめ**
ざっと調べた感じだと、こんなのがあった。

- AITalk® 声の職人®
http://www.ai-j.jp/cloud/voice/

- VoiceText
http://voicetext.jp/

- Ruby Talk®
http://www.hitachi-ul.co.jp/middleware/rubytalk/o_index.html 

- CeVIO Creative Studio
http://cevio.jp/

# **ちょっと使ってみる**
個人的に好きなのはCeVIOだけど、今回はサービスである **AITalk® 声の職人®** を使ってみる。
DEMO用のAPIなので、一部パラメータが効かないっぽい？

まず、適当に文を入力して、合成をポチッと押せば音声が流れる。
<img width=100% src="https://qiita-image-store.s3.amazonaws.com/0/66178/ac7a0bda-fe35-f99b-2dfc-0f8e85be1155.png">

簡単すぎて面白みがないので、実際通信とか仕組みを調べてみる。

# **合成時の通信**

POSTしているjsを見つけた。

~~~js
$('#btnPlay').click(function() {
	var chktextelement = document.getElementById("text"); 
		chktextstring = chktextelement.value;
		chktextstring = chktextstring.replace(/\s+/g, ""); 
		if(chktextstring == ""){
			window.alert('合成するテキストを入力してください。');
		}else{
			changeUnderGousei();//ボタン変更
			$.ajax({
				type: 'post',
				url: 'http://cloud.ai-j.jp/demo/aitalk2webapi_nop.php',
				data: {
					'speaker_id' : $("#speaker_id").val(),
					'text': $("#text").val(),
					'ext' : audio_ext,
					'volume' : $("#volume").val(),
					'speed' : $("#speed").val(),
					'pitch' : $("#pitch").val(),
					'range' : $("#range").val(),
					'anger' : $("#anger").val(),
					'sadness' : $("#sadness").val(),
					'joy' : $("#joy").val(),
				},
				dataType: 'jsonp',
				jsonpCallback: 'callback',
				success: function(result){
					//window.alert(result['url']);
					$('#result').html(result['url']);
					play(result['url']);
				},
				error: function(request, textStatus, errorThrown) {
					window.alert('合成に失敗しました。');
				}
			});
		}//if
	});
~~~

F12で開発者ツールを開いて、実際合成ボタンをポチっとおした時の通信を見てみる。

<img width=100% src="https://qiita-image-store.s3.amazonaws.com/0/66178/b0dd01fa-8b89-520e-5434-0970ee65de47.png">

Requestの中身を細かく見てみると

- リクエストURL

~~~html
http://cloud.ai-j.jp/demo/aitalk2webapi_nop.php
~~~

- パラメータ

~~~hrml
callback=callback&speaker_id=1&text=%E4%BB%8A%E6%97%A5%E3%81%AE%E6%99%A9%E5%BE%A1%E9%A3%AF%E3%81%AF%E3%80%8C%E3%82%AB%E3%83%AC%E3%83%BC%E3%83%A9%E3%82%A4%E3%82%B9%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82&ext=ogg&volume=1.0&speed=1&pitch=1&range=1&anger=0&sadness=0&joy=0&_=1498824369076
~~~

## **パラメータまとめ** ##
- callback
返却されたデータを処理する関数を指定？

- speaker_id
どのキャラに喋らせるかを指定。
htmlを見てみたら、こんな感じになっていた。

|id| キャラ|
|:-:|:-:|
|1|のぞみ|
|２|すみれ|
|3|まき|
|4|かほ|
|5|あかり|
|6|ななこ|
|7|れいな|
|11|せいじ|
|12|ひろし|
|13|おさむ|
|14|たいち|
|21|こうたろう|
|22|あんず|
|23|ゆうと|
|24|ちひろ|

- **_text_**
合成した文をここで指定する。
開発ツールで見るとエンコードされているけど、
エンコードされたものじゃなくても大丈夫みたい？

- **_ext_**
生成する音声ファイルの拡張子を指定。
デフォルトはogg。
mp3とwavも使えた。
他にも使えるものがあるかも。

- **_volume_**
生成音声データの音量を指定？
効かないっぽい・・・・

- **speed**
生成する音声データのスピーチの速さを指定。
2にすると２倍速になった。

- **pitch**
生成する音声データのピッチの高さを指定。
大きいほどピッチも高くなる。

- **range**
生成する音声データの抑揚の強さを設定。
大きいほど、抑揚も強くなる。

- **anger**
生成する音声データの怒りの強さを設定？
効かないっぽい・・・・

- **sadness**
生成する音声データの悲しさを設定？
効かないっぽい・・・・

- **joy**
生成する音声データの嬉しさを設定？
効かないっぽい・・・・

# **レスポンス**
サーバ側で音声ファイルを生成している。

~~~html
callback({"url":"http:\/\/cloud.ai-j.jp\/demo\/tmp\/1_20170630155923277518060.ogg"})
~~~

jsソースを見てみると、playにurlを渡して音声データを生成している様子。

~~~js
success: function(result){
	//window.alert(result['url']);
	$('#result').html(result['url']);
	play(result['url']);
}
~~~

ちなみに、生成された音声データは定期的に削除される様だ。
まぁ、当たり前かｗ

# **まとめ**
とりあえず、分析してみた。
文字数制限とか、英語にした時どうなるのかとか、色々気になることはあるが、
一旦おいておく。

次回はPHPで、このAPIを使ってみる。