🗣️

open_jtalkを使って発声したい

2024/03/02に公開

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.動かしてみよう

https://youtu.be/wfKMEt59c0g

6.まとめ

様々な音声合成を試してきたが、発声まで時間が短い
次回はChatGPTの回答を読み上げてもらうように機能を盛り込んでいこうと思います。

Discussion