なんと1000年以上も歴史があるらしき音声合成の試みも近年、音声合成・音声読み上げにも多くのソフトウェアや中には、AITalkやhttp://voicetext.jp/、http://open-jtalk.sp.nitech.ac.jp/のようなWebサービス(デモ)を提供してくれているサイトもあります。
音声合成・合成音声とは、人工的に人間の音声を作ることであり、作った音声は、もちろん、何らかの形で発声させることができます。
世界各国語かつ、男性風、女性風の声、感情のこもった声、より自然な声色などが既に実現されています。
このような仕組みは、ゲームの音声や初音ミクのようなキャラクタを生み出したり、視覚障害を持つ方々や幼児、外国人など文字を読むのが不得手な方々のサポートとしてウェブサイトなどの読み上げ機能に利用されたり、音声案内などにも利用されているようです。
Windowsには、簡単に導入できるGUIの音声読み上げソフトウェアがあるようですが、ここでは、Linux用のソフトを探してみました。
自身の使っているDebian含め、Linuxでは、eSpeak、eSpeak-NG、Mbrola、Festival等々の各国語を合成・発声できるものと日本語を合成できるOpen JTalkなどがあるようです。
Open JTalkについては、標準は男性風の声ですが、meiという女性用の声データもあるとのこと。
espeakをインストールしてmanで使い方を確認してみます。
すると-fオプションにテキストファイル、--stdinオプションに単語を渡すか、これらがなければ、stdin(標準入力)を読んでくれるとあります。
espeakコマンドは、デフォルトでは、単語やファイル内容を男性風の声かつ、米英語で読み上げてくれます。
テキストファイルなどをリダイレクトすることもできます。
festivalをインストールしてmanページを眺めることにします。
manによれば、--ttsにテキストファイルを渡すのが、最も簡単そうなので実行してみます。
Helloと読み上げてくれたので、これで良いようです。
Festivalもデフォルトでは、米英語かつ男声です。
open-jtalkをインストールしてmanで使い方を確認します。
う、Debianだけか...?、パッケージ名は、open-jtalk(ハイフン)ですが、コマンド名は、open_jtalk(アンダースコア)で少し戸惑いました。
お、man open_jtalkを見るとinfo open_jtalkはあるけど、本来、manはないから、Debian用だよとあります。
EXAMPLEを見るとこうなっていますが、-s/-p/-aオプションには、[auto](たぶん省略するとautoになる)があるので省いて良さげ。
-mオプションは、音声ファイル、-owオプションは、出力ファイル名、-xオプションは辞書のディレクトリを指定するとあります。
-mオプションの引数nitech_jp_atr503_m001.htsvoiceは、リポジトリにあるのか?と探すと...ありました。
-xオプションの辞書ディレクトリって...と思い、探すとopen-jtalkパッケージの依存関係に先のhts-voice-nitech-jp-atr503-m001の他にopen-jtalk-mecab-naist-jdicという辞書(dictionary)らしきパッケージがありました。
よってhts-voice-nitech-jp-atr503-m001とopen-jtalk-mecab-naist-jdicを追加でインストール、辞書ディレクトリを検索します。
引数となる情報が揃ったところで入力テキストinput.txtに「やっとできたじゃん」とでも入れて保存しておき、出力ファイルはoutput.wavのまま、先のEXAMPLEに沿ってこれらをオプション引数に指定、open_jtalkを実行してみます。
これをより最新のカーネルから成るLinuxなら入っているALSAの再生コマンドaplayで再生してみると「やっとできたじゃん」と読み上げてくれました。
Open JTalkは、日本で開発された日本語を音声合成、読み上げしてくれるものなのでデフォルトで日本語かつ男声ですが、前述、また、後述のようにmeiさんによる女声データを持ってくるとmeiさんが話してくれるようになります。
ということは、続けて、そのまま出力ファイルをaplayで指定すれば、入力テキストを読みつつ、保存しつつ、再生もしてくれることになります。
オプションで入力ファイルを渡さなくても標準入力からでもいけるんじゃないかと、やってみたところ、echoすることができました。
ちなみに日本語専門かと思いきや、自分の名前?は登録済みのようで、ちゃんと読みます。
いろいろ試してみると、漢字、ひらがな、カタカナ、算用数字、漢数字及びその並び、日付時刻など意味のある漢字数字混じりの並びの文は、それに合わせて相応に読んでくれ、手を加えればいけるようですが、少なくともデフォルトでは、連語でもアルファベットは1文字ずつ音読してくれます。
ということは、テキストファイルを展開して渡したって同じだよね?ということでcatしてみたら、これもできました。
meiデータについては、MMDAgent(http://www.mmdagent.jp/)にアクセス、[MMDAgent "Sample Script" version x.x(...)](執筆時点では、1.7(December 25, 2016))の方の[Source code]をクリックしてダウンロード・展開します。
ここで展開するのは、meiディレクトリ以下だけで十分です。
展開先は、hts-voice-nitech-jp-atr503-m001の音声データと同じ/usr/share/hts-voice/あたりで、この下にダウンロードしたファイル群の中のmeiディレクトリをコピーするなりして置いておくとよいでしょう。
その後、先のopen_jtalkコマンドで-mオプションの引数にmeiデータの.htsvoiceファイルパスを指定すれば、女性風(meiさん)の声で読み上げてくれるようになります。
オプション指定すると、特にOpen JTalkでは、コマンドが長くなりがちなのでスクリプトにしておくとよいでしょう。
そうすると、このようにすることでファイル内の文章を読み上げてくれます。
テキスト読み上げは、text to speech、音声認識は、speech to textと呼ばれることもあるようです。
それにしても、こんなに簡単に文章を読み上げてくれるようになるなんて遅ればせながら、技術の進歩の著しさに感動を覚えました。
感動ついでに、もしやと思い、調べたところ、Arduinoとスピーカー(や圧電ブザー)でも音声合成・発声できることがわかりました。