こんにちは。
いきなりですが、最近ロボット作れたら楽しいのでは?と考えることがあって、何かできるところからしようと思い文章を音声で出力する試作を作りました。
ユニットリーダーの声をひとつひとつ単音採取してPHPで繋げて発話させてみたので、今回はそれについて書きたいと思います。
声の採取
まず採取した声がこんな感じです。
iPhoneの録音機能で採取。
これが「あ」〜「ん」まで「とぅ」とか「にゅ」とか含めて全部で約120種類あります。
ボーカロイドやマツコロイドは相当入力ファイルは精査されているかと思いますが、そのような精度は出せないと思うので、これらをどこまで聞きやすくできるかがここではひとつの課題になります。
音声をトリムする
各ファイルをそのまま繋げて「こんにちは」の音声を作ってみます。
とてもテンポが悪いです…
これは空白をトリムしてあげないといけないですね。
音声のトリムにはsox(http://sox.sourceforge.net/)を使います。簡単な音声処理はこれで済むので導入してみてください。
ちなみにトリムのコマンドはこう書くようです。大きなノイズがなければきれいに空白が除去されます。
1 |
play あ.mp3 silence 1 0.1 1% reverse silence 1 0.1 1% reverse |
入力した言葉を話すようにする
では文字を入力してそれを話すようにプログラムを組みます。
コマンドラインでPHPを実行する想定で引数($argv[1])にはひらがなの話させたい言葉を入力します。あとはsoxのplayコマンドが自動的に音声を再生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$result = preg_split("//u", $argv[1], -1, PREG_SPLIT_NO_EMPTY); $temp = array(); foreach($result as $key => $res){ if(in_array($res, array('ゃ','ゅ','ょ','ぁ','ぃ','ぅ','ぇ','ぉ'))){ $temp[$key-1] .= $res; }else{ $temp[$key] = $res; } } $result = $temp; foreach($result as $res) { if(in_array($res, array('、','。','っ'))){ exec('play silence.wav'); }else{ $str = $res.'.mp3 silence 1 0.1 1% reverse silence 1 0.1 1% reverse '; exec('play '.$str); } } |
4行目〜11行目では例えば「し」と「ゃ」などの小文字が入力された際に「しゃ」とつなげて「しゃ.mp3」を参照するような処理を書いています。
14行目と15行目では促音や「、」「。」が入力された際に空白の音声ファイル「silence.wav」に置き換える処理です。
17行目と18行目で入力されたひらがなの音声ファイルの空白をsoxを用いてトリムして再生しています。
プログラムと同階層に「あ.mp3」〜「ん.mp3」を置いて実行してみます。こんなかんじ。
話した!
ロボットのような話し方でこれはこれでいいのですが、形態素解析かませて漢字入力に対応するだとか、アクセントの辞書を通して流暢な発音にするだとか課題は多そうです。
進化したらまた記事を書きます。今日はここまで(゜-゜)