【Python】解決した!Macで音声合成で喋らせる(OpenJTalk)

新米太郎
新米太郎

皆さんこんにちは新米です。

Pythonで音声合成システムを作ろうと思い、ググって見るとopen-jtalkを用いて

サンプルコードが書かれている記事が多くあったので、コピペして実行してみたが
どのコードもエラーになり失敗。。。

エラー原因を調べ無事実行できたので、同じ場所で躓いている人の為にまとめてみました。

私の開発環境
・Mac OS 11.3.1
・Python 3.8.10




エラーが出た参考コード

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.

 

正しいパスを見つける方法は、、

Findeメニューの「移動」→「フォルダへ移動」を選択する。
→ フォルダの場所を入力: /usr/  → 移動を選択

で適切なパスを探していきます。

詳しい手順はこちらを参考して下さい。
【Mac】Finderから /usr / local ディレクトリを参照する

 

私の場合だと、、、
◇辞書ファイルのパス

mech=[‘-x’,’/var/lib/mecab/dic/open-jtalk/naist-jdic’] →mech=[‘-x’,’/usr/local/Cellar/open-jtalk/1.11/dic/’]

 

◇音声ファイルのパス(男性ボイス)

htsvoice=[‘-m’,’/usr/share/hts-voice/mei/mei_normal.htsvoice’] →htsvoice=[‘-m’,’/usr/local/Cellar/open-jtalk/1.11/voice/m100/nitech_jp_atr503_m001.htsvoice’]

結構パスが違ってました。。。

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コマンドを使用します。

[‘aplay’,’-q’,’open_jtalk.wav’] → [‘afplay‘,’-q’,’open_jtalk.wav’]

 

ちなみに両コマンド共に音声入出力を行うために使われます。
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

まとめ

いかがだったでしょうか。

私と同じエラーが出た方の役に立てれば光栄です!
エラー原因を見つけた時の達成感ってハンパないですよね(笑)

エラーが出ても諦めず、ググりまくりましょう!

 

新米太郎
新米太郎

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




コメント

タイトルとURLをコピーしました