気の向くままに辿るIT/ICT
ソフトウェア

音声合成・テキスト読み上げソフトウェア

ホーム前へ次へ
フリーソフト・オープンソースを活用しよう。

音声合成・テキスト読み上げソフトウェア

音声合成・テキスト読み上げソフトウェア

2018/09/10

 なんと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のインストールと実行

$ sudo apt install espeak
$ man espeak

 espeakをインストールしてmanで使い方を確認してみます。

 すると-fオプションにテキストファイル、--stdinオプションに単語を渡すか、これらがなければ、stdin(標準入力)を読んでくれるとあります。

$ espeak -f text.file
$ echo Hello | espeak --stdin
$ espeak "espeak is speaking."
$ echo "espeak is speaking." | espeak
$ espeak < text.file
$

 espeakコマンドは、デフォルトでは、単語やファイル内容を男性風の声かつ、米英語で読み上げてくれます。

 テキストファイルなどをリダイレクトすることもできます。

Festivalのインストールと実行

$ sudo apt install festival
$ man festival
...

 festivalをインストールしてmanページを眺めることにします。

$ cat text.file
$ Hello!
$ festival --tts text.file
$

 manによれば、--ttsにテキストファイルを渡すのが、最も簡単そうなので実行してみます。

 Helloと読み上げてくれたので、これで良いようです。

 Festivalもデフォルトでは、米英語かつ男声です。

Open JTalkのインストールと実行

$ sudo apt install open-jtalk
$ man open_jtalk

 open-jtalkをインストールしてmanで使い方を確認します。

 う、Debianだけか...?、パッケージ名は、open-jtalk(ハイフン)ですが、コマンド名は、open_jtalk(アンダースコア)で少し戸惑いました。

 お、man open_jtalkを見るとinfo open_jtalkはあるけど、本来、manはないから、Debian用だよとあります。

...
% open_jtalk -s 48000 -p 240 -a 0.55 \
    -m nitech_jp_atr503_m001.htsvoice \
    -ow output.wav \
    -x dic_dir input.txt
...

 EXAMPLEを見るとこうなっていますが、-s/-p/-aオプションには、[auto](たぶん省略するとautoになる)があるので省いて良さげ。

 -mオプションは、音声ファイル、-owオプションは、出力ファイル名、-xオプションは辞書のディレクトリを指定するとあります。

$ apt-cache search nitech_jp_atr503_m001.htsvoice
$ apt-cache search nitech*
hts-voice-nitech-jp-atr503-m001 - Japanese male voice data for Open JTalk
$

 -mオプションの引数nitech_jp_atr503_m001.htsvoiceは、リポジトリにあるのか?と探すと...ありました。

$ apt depends hts-voice-nitech-jp-atr503-m001
hts-voice-nitech-jp-atr503-m001
$ apt depends open-jtalk
open-jtalk
依存: libc6 (>= 2.14)
依存: libgcc1 (>= 1:3.0)
依存: libhtsengine1 (>= 1.07)
依存: libstdc++6 (>= 5.2)
提案: open-jtalk-mecab-naist-jdic
提案: hts-voice-nitech-jp-atr503-m001
$ apt-cache search jdic$
mecab-naist-jdic - フリーの mecab 用日本語辞書 (mecab-ipadic の代替)
naist-jdic - フリーの ChaSen 用日本語辞書 (ipadic の代替)
xjdic - 和英辞書検索プログラム
open-jtalk-mecab-naist-jdic - NAIST Japanese Dictionary for Open JTalk
$

 -xオプションの辞書ディレクトリって...と思い、探すとopen-jtalkパッケージの依存関係に先のhts-voice-nitech-jp-atr503-m001の他にopen-jtalk-mecab-naist-jdicという辞書(dictionary)らしきパッケージがありました。

$ sudo apt install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
$ sudo find / -name "hts-voice"
/usr/share/hts-voice
$ ls /usr/share/hts-voice
nitech-jp-atr503-m001
$ ls /usr/share/hts-voice/nitech-jp-atr503-m001
nitech_jp_atr503_m001.htsvoice
$ sudo find / -name "naist-jdic"
/var/lib/mecab/dic/open-jtalk/naist-jdic
$

 よってhts-voice-nitech-jp-atr503-m001とopen-jtalk-mecab-naist-jdicを追加でインストール、辞書ディレクトリを検索します。

$ cat input.txt
やっとできたじゃん
$ open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
    -ow output.wav \
    -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
    input.txt
$ aplay output.wav
$

 引数となる情報が揃ったところで入力テキストinput.txtに「やっとできたじゃん」とでも入れて保存しておき、出力ファイルはoutput.wavのまま、先のEXAMPLEに沿ってこれらをオプション引数に指定、open_jtalkを実行してみます。

 これをより最新のカーネルから成るLinuxなら入っているALSAの再生コマンドaplayで再生してみると「やっとできたじゃん」と読み上げてくれました。

 Open JTalkは、日本で開発された日本語を音声合成、読み上げしてくれるものなのでデフォルトで日本語かつ男声ですが、前述、また、後述のようにmeiさんによる女声データを持ってくるとmeiさんが話してくれるようになります。

$ open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
    -ow output.wav \
    -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
    input.txt \
 && aplay output.wav
$

 ということは、続けて、そのまま出力ファイルをaplayで指定すれば、入力テキストを読みつつ、保存しつつ、再生もしてくれることになります。

$ echo "Open JTalkでもエコーできるじゃん" | open_jtalk \
    -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
    -ow output.wav \
    -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
 && aplay output.wav
$

 オプションで入力ファイルを渡さなくても標準入力からでもいけるんじゃないかと、やってみたところ、echoすることができました。

 ちなみに日本語専門かと思いきや、自分の名前?は登録済みのようで、ちゃんと読みます。

 いろいろ試してみると、漢字、ひらがな、カタカナ、算用数字、漢数字及びその並び、日付時刻など意味のある漢字数字混じりの並びの文は、それに合わせて相応に読んでくれ、手を加えればいけるようですが、少なくともデフォルトでは、連語でもアルファベットは1文字ずつ音読してくれます。

$ cat input.txt | open_jtalk \
    -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
    -ow output.wav \
    -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
 && aplay output.wav
$

 ということは、テキストファイルを展開して渡したって同じだよね?ということでcatしてみたら、これもできました。

meiデータのダウンロードと展開

 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では、コマンドが長くなりがちなのでスクリプトにしておくとよいでしょう。

$ sh speech_synthesis_script < speech_file
$ chmod u+x speech_synthesis_script
$ ./speech_synthesis_script < speech_file

 そうすると、このようにすることでファイル内の文章を読み上げてくれます。

備考

 テキスト読み上げは、text to speech、音声認識は、speech to textと呼ばれることもあるようです。

 それにしても、こんなに簡単に文章を読み上げてくれるようになるなんて遅ればせながら、技術の進歩の著しさに感動を覚えました。

 感動ついでに、もしやと思い、調べたところ、Arduinoとスピーカー(や圧電ブザー)でも音声合成・発声できることがわかりました。

  • Raspberry Piあれこれ
  • ホーム前へ次へ