
皆さんこんにちは新米です。
Pythonで音声合成システムを作ろうと思い、ググって見るとopen-jtalkを用いて
サンプルコードが書かれている記事が多くあったので、コピペして実行してみたが
どのコードもエラーになり失敗。。。
エラー原因を調べ無事実行できたので、同じ場所で躓いている人の為にまとめてみました。
エラーが出た参考コード
OpenJTalk + Python で日本語テキストを発話
#coding: utf-8 import subprocess from datetime import datetime def jtalk(t): open_jtalk=['open_jtalk'] mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic'] htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice'] speed=['-r','1.0'] outwav=['-ow','open_jtalk.wav'] cmd=open_jtalk+mech+htsvoice+speed+outwav c = subprocess.Popen(cmd,stdin=subprocess.PIPE) c.stdin.write(t.encode()) c.stdin.close() c.wait() aplay = ['aplay','open_jtalk.wav'] wr = subprocess.Popen(aplay) def say_datetime(): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) jtalk(text) if __name__ == '__main__': say_datetime()
他にも参考にしたけど上手くいかなかったリンク先
解決した!エラーの原因は大きく分けて2点
・Macにaplayコマンドは存在しない
パスが間違っている(辞書ファイル&音声ファイル)
mech=[‘-x’,’/var/lib/mecab/dic/open-jtalk/naist-jdic’]
htsvoice=[‘-m’,’/usr/share/hts-voice/mei/mei_normal.htsvoice’]
上記の[ ]内のパスが誤っていると以下のようなエラーが出ます。
ERROR: Mecab_load() in mecab.cpp: Cannot open /var/lib/mecab/dic/open-jtalk/naist-jdic.
正しいパスを見つける方法は、、
→ フォルダの場所を入力: /usr/ → 移動を選択
で適切なパスを探していきます。
詳しい手順はこちらを参考して下さい。
【Mac】Finderから /usr / local ディレクトリを参照する
私の場合だと、、、
◇辞書ファイルのパス
◇音声ファイルのパス(男性ボイス)
結構パスが違ってました。。。
Macにaplayコマンドは存在しない
python3実行時のエラー
FileNotFoundError: [Errno 2] No such file or directory: 'aplay'
直接ターミナルに打ち込んだ結果
user@computer % aplay open_jtalk.wav zsh: command not found: aplay
aplayコマンドはWin対応で、Macには備わっていないらしいです。
aplayの代わりにMac(Linux)ではafplayコマンドを使用します。
ちなみに両コマンド共に音声入出力を行うために使われます。
afplay -h でオプション一覧を確認することが可能です。
参考資料はこちら
Macでもmikutterに喋ってもらうためのプラグインを作ったよ
Macで音声合成で喋らせる(OpenJTalk)
エラー原因もわかったところでMacで正常に動くサンプルコードを載せておきます。
現在の日時を喋らせてみましょう!
# 実行した時間の音声を出力 import subprocess from datetime import datetime # 時間を喋ってもらう def jtalk(t): open_jtalk=['open_jtalk'] mech=['-x','/usr/local/Cellar/open-jtalk/1.11/dic/'] htsvoice=['-m','/usr/local/Cellar/open-jtalk/1.11/voice/m100/nitech_jp_atr503_m001.htsvoice'] speed=['-r','1.0'] outwav=['-ow','open_jtalk.wav'] cmd=open_jtalk+mech+htsvoice+speed+outwav subprocess.run(cmd,input=t.encode()) afplay = ['afplay','open_jtalk.wav'] subprocess.run(afplay) # 今の時間を取得 def say_datetime(): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) jtalk(text) if __name__ == '__main__': say_datetime()
実行結果
男性ボイス.ver
まとめ
いかがだったでしょうか。
私と同じエラーが出た方の役に立てれば光栄です!
エラー原因を見つけた時の達成感ってハンパないですよね(笑)
エラーが出ても諦めず、ググりまくりましょう!

最後まで読んでいただきありがとうございました。
コメント