DataSpider で CSVデータを AITalk® WebAPI を使って音声化してみる

# 概要
高品質音声合成エンジン [AITalk](http://www.ai-j.jp/about/)の、Web API サービスである [AITalk® WebAPI](http://www.ai-j.jp/cloud/webapi/) を使って、CSVファイルの内容を読み上げる音声ファイルを作成してみます。

# 用意するもの
1. [AITalk® WebAPI](http://www.ai-j.jp/cloud/webapi/)を利用するためのアカウント
1. [DataSpider Servista](https://www.appresso.com/servista/) (以下 DataSpider )

　※DataSpiderは、CSVデータの読み取りや Web API の送受信に使います。

# [AITalk® WebAPI](http://www.ai-j.jp/cloud/webapi/)とは
HTTP(S)で音声にしたいテキストをパラメータに指定してリクエストを送信すると、テキストを読み上げた音声のファイルをレスポンスとして返してくれます。⇒[WebAPI仕様](http://www.ai-j.jp/cloud/webapi/spec/)

より詳細な [WebAPI 仕様書](http://cloud.ai-j.jp/doc/aitalk_webapi_specification.pdf) も用意されているので、今回はこれを元にAPIを試してみます。

# [AITalk® WebAPI](http://www.ai-j.jp/cloud/webapi/) × [DataSpider](https://www.appresso.com/servista/)
今回はDataSpiderを使って、ファイルの読み取りと組み合わせた処理を作成してみます。
処理の内容は下記のような流れです。

1. CSVファイルからデータを読み取り、
1. 音声にしたいテキストに変換して、
1. AITalk® WebAPIに送信、音声ファイルを受け取る

それでは、そんな処理をDataSpiderのスクリプトとして、作成してみましょう。

# DataSpiderのスクリプト作成
## CSVアダプタ
まずは 任意の場所にあるCSVファイルを読み取る処理を作成します。
今回はテストデータとして、近所の中華料理屋のメニューと値段をCSVファイルにしたものを用意しました。下記のような内容です。
<dl>
<dd>味噌ラーメン　650円</dd>
<dd>ニラソバ　700円</dd>
<dd>タンメン　600円</dd>
<dd>　　・・・</dd>
<dd>　　・・・</dd>
<dd>　　・・・</dd>
</dl>
タブ区切りでメニューと値段が1行づつ入っています。
このCSVファイルを読み取る処理を作成します。

1. DataSpider を起動し、デザイナを開きます。
1. 任意のプロジェクトとスクリプトを作成します。
1. 画面の右側にある [ツールパレット] の [ファイル] カテゴリから、CSVアダプタの ***CSV読み取り*** をドラッグ＆ドロップして、スクリプトキャンバスに配置します。

![CSVファイル読み取り.png](https://qiita-image-store.s3.amazonaws.com/0/60568/ec4c676f-0571-fb2a-67c4-566ff7ce6b02.png)

 - [必須設定] の [ファイル] には読み取るCSVファイルのパスを指定します。
 - [必須設定] の [列一覧] には、CSVの列を定義します。[列名] はそれぞれ ***menu*** と ***price*** としました。

## CSVデータを音声化するテキストに編集
次にCSVデータを音声化するテキストとしてまとめます。
まずは、マッパーを使って、CSVアダプタから読み取ったメニューと値段を文字列結合します。そして、読み上げるときに、それぞれのメニューの間には "間" があると自然な響きとなるので、メニューと値段を文字列結合する度に、句読点も付加します。その後、DataSpiderの変数であるスクリプト変数に文字列を蓄積していきます。

（編集イメージ）
味噌ラーメン　650円　　*CSVファイルから読み取りしたレコード*
↓
味噌ラーメン650円、　　*CSVファイルから読み取りしたレコードに句読点 "、" を結合*
↓
"味噌ラーメン650円、"　　*スクリプト変数の ”AITalk_Text” に追加*

1. 画面の右側にある [ツールパレット] の [変換] カテゴリから、[基本] の ***マッピング*** をドラッグ＆ドロップして、スクリプトキャンバスに配置します。
1.  ***マッピング*** アイコンをダブルクリックして、マッピングキャンバスを開きます。
1.  画面の右側にある [ツールパレット] の [文字列] カテゴリから、[演算] の ***連結*** をドラッグ＆ドロップして、マッピングキャンバスに配置します。あとは結合したい項目をつなぐだけです。 句読点 "、" は [演算] の ***単一行文字列定数***
 で表現できます。マッピングの全体像は下記を参考にしてください。

### マッピングキャンバス
![テキスト作成.png](https://qiita-image-store.s3.amazonaws.com/0/60568/135663da-6525-4d36-32ca-63ad5e139bdb.png)

この処理をレコード数分繰り返せば、メニューを読み上げるテキストが作成できます。スクリプトキャンバス上でマッパーを ***繰り返し(データ件数)***　で挟んで、CSVファイルのレコード数分だけ処理を繰り返すようにします。

1. 画面の右側にある [ツールパレット] の [基本] カテゴリから、[フロー] の ***繰り返し(データ件数)*** をドラッグ＆ドロップして、スクリプトキャンバスに配置します。

## RESTアダプタ
AITalk® WebAPI の送受信を行う処理から作成してみます。
WebAPI は Curlコマンド などでも送受信可能ですが、それよりもDataSpiderのRESTアダプタを使用するほうが簡単です。

1. 画面の右側にある [ツールパレット] の [ネットワーク] カテゴリから、RESTアダプタの ***GET実行*** をドラッグ＆ドロップして、スクリプトキャンバスに配置します。
1. 設定ダイアログが開くので、AITalk® WebAPIの [WebAPI 仕様書](http://cloud.ai-j.jp/doc/aitalk_webapi_specification.pdf) を参考にHTTPリクエストの設定をします。

### [必須設定]
![AITalk.png](https://qiita-image-store.s3.amazonaws.com/0/60568/3c9dc2b2-f379-9b73-ebba-e196d1ffdda7.png)

 - [必須設定] の [接続先] プルダウンから***追加***を指定すると、***REST接続設定*** の画面が表示されるので、***URL***に http://webapi.aitalk.jp/ と入力します。***REST接続設定*** の***名前*** は「AITalk接続設定」としました。
 - [必須設定] の [パス] にはwebapiのパス webapi/v2/ttsget.php と入力します。
 - [必須設定] の [クエリパラメータ] には、[WebAPI 仕様書](http://cloud.ai-j.jp/doc/aitalk_webapi_specification.pdf) の ***2-1-1. リクエストパラメータ*** を参照して、パラメータを追加してみます。最低限必要なパラメータは、下記4つです。

- username
- password
- text
- speaker_name

***username*** と ***password*** は利用申し込みを行った際に、発行されたものを使います。
***text*** は音声にしたいテキストです。今回はCSVから作成したデータをバインディングしたいので、***スクリプト変数*** というDataSpiderの変数を指定しています。
***speaker_name*** は [WebAPI 仕様書](http://cloud.ai-j.jp/doc/aitalk_webapi_specification.pdf) の ***3-1. 標準話者*** を参考に音声のペルソナを指定します。今回はやさしい口調の子供を模した ゆうと君 を指定してみました。話者の雰囲気のバリエーションが広いのも AITalk の魅力です。

### [レスポンス設定]
![レスポンス設定.png](https://qiita-image-store.s3.amazonaws.com/0/60568/d3d02abc-f1bf-5ea7-db16-b724e4c54e24.png)

 - APIは合成した音声データをファイルとして返却するので、[レスポンス設定] の [データ出力先] は ***ファイル*** を指定します。
 - 保存する音声データは /data/voice.wav とし、[レスポンス設定] の [ファイルパス] に入力します。

これで、APIを送信する準備は整いました。

## スクリプト完成
![スクリプト完成図.png](https://qiita-image-store.s3.amazonaws.com/0/60568/5944c47b-bfc0-780c-3fc0-98add2863ca1.png)

メニューと値段を記載したCSVファイル /data/menu.csv を置き、スクリプトを実行すると、CSVの内容を読み上げる音声ファイル /data/voice.wav が作成されるはずです。
Windows Media PlayerなどWAVEファイルに対応したソフトで実行すれば、作成された音声を確認できます。


## まとめ
 - [AITalk® WebAPI](http://www.ai-j.jp/cloud/webapi/) を使うと、簡単にテキストを高品質音声に変換できます。声の雰囲気の違う話者をパラメータとして設定できます。他にも抑揚などのパラメータ指定が可能です。詳しくは [WebAPI 仕様書](http://cloud.ai-j.jp/doc/aitalk_webapi_specification.pdf)　を参照してみてください。
 - [DataSpider](https://www.appresso.com/servista/) を使うと、ファイルの読み取り処理を簡単に作成できます。
 - [DataSpider](https://www.appresso.com/servista/) を使うと、Web APIの送受信処理を簡単に作成できます。