Python

ラズパイで音声を出力する方法(OpenJTalkとAquesTalk)

スポンサーリンク

ラズパイで音声を出力して、Siriのようなものを作りたい!ということでまずは音声を出力する方法を調べましたのでまとめていきます!

ラズパイでよく使われる音声合成ソフトはOpenJTalkもしくはAquesTalkです。

両方のソフトのインストール方法、使い方を説明していきます。

調べているときにかなりつまづいたところもあったので、これからOpenJTalkもしくはAquesTalkを使いたい!という方の役に立つかなと思います。

OpenJTalkとは

オープンソース(修正BSDライセンス)の日本語テキストに基づいて自由な音声を生成するHMMテキスト音声合成システムです。(Open JTalk

簡単に言うと文字列(テキスト)を音声へ変換してくれるソフトウェアです。

AquesTalkとは

AquesTalk(アクエストーク)は、アクエストが開発・販売している音声合成用ソフト。(wikipediaより引用)

AquesTalk Pi(アクエストークパイ)と言われる、ラズパイ用の音声合成アプリです。

ライセンスが必要なのですが、個人の非営利目的であれば無償で利用することが可能です。

事前準備

どちらも日本語を用いるのでまず、ラズパイを日本語入力対応にする必要があります。その設定を行っていきます。ターミナルで以下のコマンドを入力してください。

sudo apt-get update(パッケージをアップデート)
sudo apt-get install fcitx-mozc(日本語入力を有効に)
sudo reboot

再起動をしたら設定は完了です。画面右側にキーボードのマークが表示されていると思います。これをクリックするとオレンジ色のマークに変わります。これで半角/全角で日本語入力に変換できます。

OpenJTalkインストールから出力まで

インストール

以下のコマンドをターミナルに入力します。

sudo apt-get update #アップデートする
sudo apt-get install open-jtalk #インストール
#推奨されているパッケージ
#音声合成のエンジン、辞書、音声データ
sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

テキストファイル・音声ファイル(.wav)の作成

下記のように操作し、テキストエディタを開きます。

次にテキストファイルに出力したい文字を入力して保存します。今回は「voice.txt」として保存しています。

テキストファイルの文字コードはUTF-8で作成してください

#音声ファイルの作成
sudo open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow voice.wav voice.txt

音声ファイル作成のコマンドの内容は以下の通りです。

open_jtalk  辞書ファイルのパス  音響ファイルのパス  保存するwavファイルのパス  しゃべらせたいテキストファイルのパス

これで「voice.wav」という音声ファイルが作成されました。

(メモ)open_jtalkコマンドオプション

【辞書と音声データのオプション】
-x (辞書の指定)
辞書そのものではなく辞書があるフォルダーを指定
-m (音声データの指定)
音声データ(ファイル)を指定
【出力するファイルに関するオプション】
-ow (WAVファイルの指定)
音声に変換したデータを保存するWAVファイルを指定
-ot (ログファイルの指定)
【音声データの生成に関するオプション】
-s (サンプリング周波数)
-p (フレーム周期)
-a (オールパス値)
-b (ポストフィルター係数)
-r (スピーチ速度係数)
-fm (追加ハーフトーン)
-u (有声/無声境界値)
-jm (スペクトラム系列内変動の重み)
-jf (F0系列内変動の重み)
-z (オーディオバッファサイズ)

音声出力

ターミナルに以下のコマンドを入力すると、音声ファイルが再生されます。

aplay -Dhw:1,0 voice.wav

音声出力の設定について

音声がうまく出力されない方は設定を行います。

先ほどのコマンド「aplay -Dhw:1,0 voice.wav」の-Dhw:1,0でデバイスの指定をしています。

aplay -l

このコマンドを入力すると、以下のようにハードウェアデバイスの情報が表示されます。

カードとデバイスに注目してください。下の例でいうと、

  • HDMIで出力:-Dhw:0,0
  • Headphoneで出力:-Dhw:1,0

と設定することにより、出力先を変更できます。

女性の声使用する場合

デフォルトは男性の声になっていますので、女性の声を利用したい方は以下の手順で設定します。

#MMDAgentのパッケージをダウンロード
wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
#zipファイルの解凍
unzip ./MMDAgent_Example-1.7.zip
#meiというファイルをhts-voiceにコピー
sudo cp -r ./MMDAgent_Example-1.7/Voice/mei/ /usr/share/hts-voice/

先ほどと少し参照先を変え、音声ファイルを作成、再生します。

sudo open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice  -ow voice.wav voice.txt
aplay -Dhw:1,0 voice.wav

女性の声に変更されていると思います!

python3から音声出力(ソースコード)

ではpythonのスクリプトファイルから音声を出力させてみたいと思います。

import subprocess#subprocessは、Python内からコマンドを実行するためのモジュール
from datetime import datetime

def jtalk(t):
    open_jtalk=['open_jtalk']
    mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']#-x (辞書の指定)
    htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']#-m (音声データの指定)
    speed=['-r','1.0']#-r (スピーチ速度係数)
    outwav=['-ow','open_jtalk.wav']#-ow (WAVファイルの指定)
    cmd=open_jtalk+mech+htsvoice+speed+outwav#子プロセスの生成に使用されるコマンド本文。
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)#新しいプロセスで子のプログラムを実行
    c.stdin.write(t.encode('utf-8'))#テキストをutf-8にエンコード
    c.stdin.close()
    c.wait()#子プロセスが終了するまで待つ
    aplay = ['aplay','-q','-Dplughw:1,0','open_jtalk.wav']
    wr = subprocess.Popen(aplay)#aplayコマンド実行

if __name__ == '__main__':
    jtalk("こんにちは")

関数jtalkの引数を変更するだけで出力する音声を変更できます。

aplay = ['aplay','-q','-Dplughw:1,0','open_jtalk.wav']

'-Dplughw:1,0'の部分を変更すると出力先を変更できます!

AquesTalkダウンロードから出力まで

次にAquesTalkで音声を発信させます。

色々なサイトに載っているURLでは取得できませんでした。こちらのコマンドでダウンロード・解凍してください。

#ダウンロードできない
wget http://www.a-quest.com/download/package/aquestalkpi-20130827.tgz
#こちらを実行
wget https://www.a-quest.com/archive/package/aquestalkpi-20201010.tgz
tar xzvf aquestalkpi-20201010.tgz

次にディレクトリを移動し、以下のコマンドを入力するだけで音声を出力できます!

cd  aquestalkpi
#音声出力コマンド
./AquesTalkPi "漢字も読めます。" | aplay 
 #出力変更はaplayの後ろに-Dplughw:1,0を入力
./AquesTalkPi [オプション] 入力文字列  [ > 出力ファイル ]

まとめ

二つとも簡単に使用できて、使い方が簡単ですね。

是非使ってみてください!

AquesTalkの方がゆっくり発生してくれて、好みでした。

しかし、ネットにあまり情報がないですし、ライセンス問題などもありますので今後はOpenJTalkを使っていこうかなと思います!!

参考サイト

参考にさせて頂いたサイト一覧です。

【OpenJTalk】

Raspberry Piで音声合成:Open JTalkでしゃべるラズパイを作る

OpenJTalk + python で日本語テキストを発話

OpenJtalkを使って日本語をRaspberry Piに喋らせる

【AquesTalk】

AquesTalk Pi

それ、ラズパイでつくれるよ——日本語を喋らせる

スポンサーリンク

-Python