open_jtalkを使って発声したい
1.背景
さっくと音声合成をしていきたいがpyttsx3を試したところ、自分の環境だと日本語に対応した発声ができないことが分かったのでopen-jtalkコマンドを使って発声をしていく
エンジンリスト確認ソース
```
import pyttsx3
engine = pyttsx3.init()
voicelist = engine.getProperty('voices')
for voice in voicelist:
print(f'voice: {voice.name}')
print(f'id: {voice.id}')
print('')
```
実行結果
voice: afrikaans
id: afrikaans
voice: aragonese
id: aragonese
voice: bulgarian
id: bulgarian
voice: bengali
id: bengali
voice: bosnian
id: bosnian
voice: catalan
id: catalan
voice: czech
id: czech
voice: welsh
id: welsh
voice: danish
id: danish
voice: german
id: german
voice: greek
id: greek
voice: default
id: default
voice: english
id: english
voice: en-scottish
id: en-scottish
voice: english-north
id: english-north
voice: english_rp
id: english_rp
voice: english_wmids
id: english_wmids
voice: english-us
id: english-us
voice: en-westindies
id: en-westindies
voice: esperanto
id: esperanto
voice: spanish
id: spanish
voice: spanish-latin-am
id: spanish-latin-am
voice: estonian
id: estonian
voice: basque-test
id: basque-test
voice: Persian+English-UK
id: Persian+English-UK
voice: Persian+English-US
id: Persian+English-US
voice: persian-pinglish
id: persian-pinglish
voice: finnish
id: finnish
voice: french-Belgium
id: french-Belgium
voice: french
id: french
voice: irish-gaeilge
id: irish-gaeilge
voice: greek-ancient
id: greek-ancient
voice: gujarati-test
id: gujarati-test
voice: hindi
id: hindi
voice: croatian
id: croatian
voice: hungarian
id: hungarian
voice: armenian
id: armenian
voice: armenian-west
id: armenian-west
voice: interlingua
id: interlingua
voice: indonesian
id: indonesian
voice: icelandic
id: icelandic
voice: italian
id: italian
voice: lojban
id: lojban
voice: georgian
id: georgian
voice: kannada
id: kannada
voice: kurdish
id: kurdish
voice: latin
id: latin
voice: lingua_franca_nova
id: lingua_franca_nova
voice: lithuanian
id: lithuanian
voice: latvian
id: latvian
voice: macedonian
id: macedonian
voice: malayalam
id: malayalam
voice: malay
id: malay
voice: nepali
id: nepali
voice: dutch
id: dutch
voice: norwegian
id: norwegian
voice: punjabi
id: punjabi
voice: polish
id: polish
voice: brazil
id: brazil
voice: portugal
id: portugal
voice: romanian
id: romanian
voice: russian
id: russian
voice: slovak
id: slovak
voice: albanian
id: albanian
voice: serbian
id: serbian
voice: swedish
id: swedish
voice: swahili-test
id: swahili-test
voice: tamil
id: tamil
voice: telugu-test
id: telugu-test
voice: turkish
id: turkish
voice: vietnam
id: vietnam
voice: vietnam_hue
id: vietnam_hue
voice: vietnam_sgn
id: vietnam_sgn
voice: Mandarin
id: Mandarin
voice: cantonese
id: cantonese
2.試した環境
番号 | 項目名 | リンク |
---|---|---|
1 | lubuntu22.04 デスクトップ | lubuntu 22.04 ダウンロードサイト |
2 | Anker Sound Core2 | Amazonリンク ※1 |
※1 usbがtype-b版が見つからないのでtype-c版のリンク貼ります
3.パッケージの導入と環境確認
pipとaptでそれぞれ追加したパッケージ名を記載します
pipインストール
python3 -m pip install subprocess
python3 -m pip install playsound
aptインストール
sudo apt-get update
sudo apt-get install open-jtalk
sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
4.実装
ライブラリのインポート
import subprocess #コマンドを実行するため
from playsound import playsound #生成したwavファイル再生
変数
text_dict="/var/lib/mecab/dic/open-jtalk/naist-jdic" #辞書モデル
voice_model="/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice" #音響モデル
save_file="./sound.wav" #保存するwavファイル
使用するopen_jtalkのオプション
オプション名 | 意味 |
---|---|
-x | 辞書のディレクトリパス |
-m | HTS voice ファイルのパス |
-ow | 出力するwav ファイル名 |
全体のソースコード
zenn_voice.py
import subprocess
from playsound import playsound
text_dict="/var/lib/mecab/dic/open-jtalk/naist-jdic" #辞書モデル
voice_model="/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice" #音響モデル
save_file="./sound.wav" #保存するwavファイル
def sound_wav(message):
subprocess.run(['open_jtalk', '-x', text_dict, '-m', voice_model, '-ow', save_file], input=message.encode())
playsound(save_file)
if __name__ == '__main__':
sound_wav("明日は晴れるかな")
5.動かしてみよう
6.まとめ
様々な音声合成を試してきたが、発声まで時間が短い
次回はChatGPTの回答を読み上げてもらうように機能を盛り込んでいこうと思います。
Discussion