私的AI研究会 > OpenJtalk2
以前に Raspberry Pi で利用した音声合成ソフト「Open JTalk」 を再検証。
OpenJTalk + Python でおしゃべりさせてみる。
Linux 環境ではパッケージ管理ソフト「apt」によりインストールできるので比較的簡単。
Windows 環境ではソースコードからコンパイルする必要がある。Visual Studio の C++ コンパイラを導入が必須。
参考引用ページ → OpenJTalk + python で日本語テキストを発話
(py37) $ apt search open-jtalk ソート中... 完了 全文検索... 完了 open-jtalk/focal 1.11-1build1 amd64 日本語音声合成システム open-jtalk-mecab-naist-jdic/focal,focal 1.11-1build1 all NAIST Japanese Dictionary for Open JTalk (py37) $ apt search hts-voice-nitech-jp ソート中... 完了 全文検索... 完了 hts-voice-nitech-jp-atr503-m001/focal,focal 1.05-5 all Japanese male voice data for Open JTalk
(py37) $ sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001「mecab」の辞書は、「/var/lib/mecab/dic/open-jtalk/naist-jdic/」にインストールされる
(py37) $ sudo mkdir /usr/share/hts-voice/mei (py37) $ sudo cp ~/ダウンロード/MMDAgent_Example-1.8/Voice/mei/*.htsvoice /usr/share/hts-voice/mei
参考引用ページ → 【Windows】WindowsでOpen JTalkを使ってみる
種別 | ダウンロードファイル | URL |
HTSエンジン | hts_engine_API-1.10.tar.gz | https://sourceforge.net/projects/hts-engine/ |
Open JTalk | open_jtalk-1.11.tar.gz | https://sourceforge.net/projects/open-jtalk/ |
辞書ファイル | open_jtalk_dic_shift_jis-1.11.tar.gz | |
Voiceファイル | hts_voice_nitech_jp_atr503_m001-1.05.tar.gz | ※ 上記URLで Fileを選択 |
Voiceファイル(女性) | MMDAgent_Example-1.8.zip | http://www.mmdagent.jp/ |
> cd C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build > vcvarsall.bat x64 ********************************************************************** ** Visual Studio 2022 Developer Command Prompt v17.3.3 ** Copyright (c) 2022 Microsoft Corporation ********************************************************************** [vcvarsall.bat] Environment initialized for: 'x64'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\Hostx64\x64 ← 2022/09/12 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64 ← 2023/12/20
> cd C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build > nmake Microsoft(R) Program Maintenance Utility Version 14.33.31629.0 Copyright (C) Microsoft Corporation. All rights reserved. NMAKE : fatal error U1064: MAKEFILE が見つかりません、またターゲットが指定されていません。 Stop.
temp ├─hts_engine_API-1.10 ├─hts_voice_nitech_jp_atr503_m001-1.05 ├─MMDAgent_Example-1.8 ├─open_jtalk-1.11 └─open_jtalk_dic_shift_jis-1.11
> cd C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build > vcvarsall.bat x64 ********************************************************************** ** Visual Studio 2022 Developer Command Prompt v17.3.3 ** Copyright (c) 2022 Microsoft Corporation ********************************************************************** [vcvarsall.bat] Environment initialized for: 'x64'
> cd \temp\hts_engine_API-1.10 > nmake /f Makefile.mak : > nmake /f Makefile.mak install :「c:\hts_engine_API」フォルダが作成される
> cd \temp\open_jtalk-1.11 > nmake /f Makefile.mak : > nmake /f Makefile.mak install :「c:\open_jtalk」フォルダ「open_jtalk/bin」フォルダ内に「open_jtalk.exe」が作成される
> mkdir c:\open_jtalk\bin\dic > copy c:\temp\open_jtalk_dic_shift_jis-1.11\*.* c:\open_jtalk\bin\dic
> mkdir c:\open_jtalk\bin\Voice\nitech > copy c:\temp\hts_voice_nitech_jp_atr503_m001-1.05\nitech_jp_atr503_m001.htsvoice c:\open_jtalk\bin\Voice\nitech > mkdir c:\open_jtalk\bin\Voice\mei > copy c:\temp\MMDAgent_Example-1.8\Voice\mei\*.htsvoice c:\open_jtalk\bin\Voice\mei > mkdir c:\open_jtalk\bin\Voice\slt > copy c:\temp\MMDAgent_Example-1.8\Voice\slt\*.htsvoice c:\open_jtalk\bin\Voice\slt > mkdir c:\open_jtalk\bin\Voice\takumi > copy c:\temp\MMDAgent_Example-1.8\Voice\takumi\*.htsvoice c:\open_jtalk\bin\Voice\takumi
> cd c:\open_jtalk\bin > echo 準備ができたので、実際に合成音声ファイルを作成してみます 。> input.txt
C:\open_jtalk\bin │ input.txt │ open_jtalk.exe ├─dic │ char.bin │ COPYING │ left-id.def │ matrix.bin │ pos-id.def │ rewrite.def │ right-id.def │ sys.dic │ unk.dic │ └─Voice ├─mei │ mei_angry.htsvoice │ mei_bashful.htsvoice │ mei_happy.htsvoice │ mei_normal.htsvoice │ mei_sad.htsvoice │ ├─nitech │ nitech_jp_atr503_m001.htsvoice │ ├─slt │ cmu_us_arctic_slt.htsvoice │ └─takumi takumi_angry.htsvoice takumi_happy.htsvoice takumi_normal.htsvoice takumi_sad.htsvoice
> cd c:\open_jtalk\bin > open_jtalk.exe -m Voice\nitech\nitech_jp_atr503_m001.htsvoice -x dic -ow output.wav input.txt > open_jtalk.exe -m Voice\mei\mei_normal.htsvoice -x dic -ow output1.wav input.txt・音声ファイルが作成されれば OK
Linux/Windows 環境では音声ファイルの再生方法が異なる。(Linuxでは、aplay / Windowsでは、winsound モジュールを利用)
また、今indowsでのコンパイルでの辞書生成は shift-jis なので python の内部エンコードから、stdin に渡す際に encoding を変換する必要がある。
これらの理由から、Linux/Windows 環境 それぞれ別のソースコード対応とする。
参考引用ページ → OpenJTalk + python で日本語テキストを発話
# -*- coding: utf-8 -*- ##------------------------------------------ ## Japanese speaking program Ver 0.01 ## by Open JTalk platform: linux ## ## 2022.09.13 Masahiro Izutsu ##------------------------------------------ ## jtalk.py import subprocess from datetime import datetime HTS_VOICE = ['mei/mei_normal.htsvoice', 'nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice', 'mei/mei_angry.htsvoice', 'mei/mei_bashful.htsvoice', 'mei/mei_happy.htsvoice', 'mei/mei_sad.htsvoice' ] def jtalk(t, voice = 0, waitf = False): open_jtalk=['open_jtalk'] mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic'] htsvoice=['-m','/usr/share/hts-voice/' + HTS_VOICE[voice]] 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','-q','open_jtalk.wav'] wr = subprocess.Popen(aplay) if waitf: wr.wait() def say_datetime(voice = 0, waitf = False): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) jtalk(text, waitf, voice) if __name__ == '__main__': import sys args = sys.argv sel = '0' if len(args) <= 1 else args[1] voice = int(sel) if voice >= len(HTS_VOICE): voice = 0 jtalk(u'オープンジェイトークを使用して日本語を話します', voice, True) say_datetime(voice)
(base) $ conda activate py37
番号 | 種別 |
0 | 女性 (normal) |
1 | 男性 |
2 | 女性 (angry) |
3 | 女性 (bashful) |
4 | 女性 (happy) |
5 | 女性 (sad) |
(py37) $ cd ~/workspace_py37/jtalk (py37) $ python3 jtalk.py
# -*- coding: utf-8 -*- ##------------------------------------------ ## Japanese speaking program Ver 0.01 ## by Open JTalk platform: windows ## ## 2022.09.13 Masahiro Izutsu ##------------------------------------------ ## jtalkw.py import subprocess import winsound from datetime import datetime HTS_VOICE = ['mei/mei_normal.htsvoice', 'nitech/nitech_jp_atr503_m001.htsvoice', 'mei/mei_angry.htsvoice', 'mei/mei_bashful.htsvoice', 'mei/mei_happy.htsvoice', 'mei/mei_sad.htsvoice' ] def jtalk(t, voice = 0): # depend on your install folder OPENJTALK_BINPATH = 'c:/open_jtalk/bin' OPENJTALK_DICPATH = 'c:/open_jtalk/bin/dic' OPENJTALK_VOICEPATH = 'c:/open_jtalk/bin/Voice/' + HTS_VOICE[voice] open_jtalk=[OPENJTALK_BINPATH + '/open_jtalk.exe'] mech=['-x',OPENJTALK_DICPATH] htsvoice=['-m',OPENJTALK_VOICEPATH] speed=['-r','1.0'] outwav=['-ow','open_jtalk.wav'] cmd=open_jtalk+mech+htsvoice+speed+outwav c = subprocess.Popen(cmd,stdin=subprocess.PIPE) # convert text encoding from utf-8 to shitf-jis c.stdin.write(t.encode('shift-jis')) c.stdin.close() c.wait() # play wav audio file with winsound module winsound.PlaySound('open_jtalk.wav', winsound.SND_FILENAME) def say_datetime(voice = 0): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) print(text) jtalk(text, voice) if __name__ == '__main__': import sys args = sys.argv sel = '0' if len(args) <= 1 else args[1] voice = int(sel) if voice >= len(HTS_VOICE): voice = 0 jtalk(u'オープンジェイトークを使用して日本語を話します', voice) say_datetime(voice)
(base) PS > conda activate py37y
番号 | 種別 |
0 | 女性 (normal) |
1 | 男性 |
2 | 女性 (angry) |
3 | 女性 (bashful) |
4 | 女性 (happy) |
5 | 女性 (sad) |
(py37) PS > cd /anaconda_win/workspace_py37/jtalk (py37) PS > python jtalkw.py
import jtalkw jtalkw.jtalk(u'日本語を話します')