PCにテキスト文字を音声読み上げさせるための手順とプログラムについて、紹介します。
事前準備
まずは辞書データのインストールが必要です。辞書データをもとに音声ファイルへの変換には、「Open JTalk」を利用します。
Ubuntuであれば以下のコマンドを実行し、Open JTalkの関連ファイルをインストールします。
sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
ちなみにOpen JTalk関連ファイルには辞書データも含まれますが、「Mecab」というオープンソースの形態素解析エンジンで利用されているものとよく似た辞書データとなっています。(発話音声のアクセント情報が追加されているようです)
サンプルプログラム
サンプルプログラムはUbuntuの環境で確認しています。また音声の再生には、aplayコマンドを利用することとします。OS等のプログラム実行環境によっては、サンプルプログラム内に記載している辞書ファイルのパス(-xオプション)や音声ファイルのパス(-mオプション)が変わってきますので、その点は注意してください。
音声を発話するまでの大きな流れは以下となります。
- 再生したい音声をテキスト文字として準備する
- テキスト文字をもとに、音声ファイルに変換する
- 変換した音声ファイルを再生する
import subprocess
def jtalk(str):
# -x : 辞書ディレクトリの指定
# -m : 音声エンジンの指定
# -r : 音声スピードの指定
# -ow: 音声出力結果の保存ファイル(上書き)
open_jtalk = ['open_jtalk',
'-x','/var/lib/mecab/dic/open-jtalk/naist-jdic',
'-m','/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice',
'-r','1.5',
'-ow','sample_jtalk.wav']
subprocess.run(open_jtalk, input=str.encode())
# 音声再生
aplay = ['aplay',
'-t','wav',
'sample_jtalk.wav']
subprocess.run(aplay)
# talkメソッド
def talk():
text = 'チケットの料金は、12,345円です。'
text += 'OK, thank you.'
jtalk(text)
# main
if __name__ == '__main__':
talk()
Code language: Python (python)
日本語の文章については多くの場合、以下のような形式のテキスト文字で構成されます。
- カタカナ
- ひらがな
- 漢字
- 数字
- 英字
サンプルプログラム内では、テキスト文字を
「チケットの料金は、12,345円です。」
「OK, thank you.」
としておくことで、上記の形式で音声発話できるかを一度に確認しています。
その結果、「thank」の箇所は「ティーエイチエーエヌケー」と発話されてしまいました。
「辞書データに存在しない英単語」があれば、その英単語は英文字を順に読み上げるようです。
数字については桁数を変えてみると桁数を正しく認識でき、「,」有無の影響もないようです。
例えば「1,000」も「1000」も「せん」と発話します。
その他テキストデータを変えて試したところでは、
「日本語で利用されていない漢字」(例えば「雯」など)は発話されず無音でした。
また、読点を入れると、その分の間が発生するようです。
「より自然な流れの発話にしたい」といった場合は
やや過多なくらいに読点を入れたデータを準備するのも解決策の1つです。
音声スピード(-rオプション)は1.5くらいが違和感の無いスピードでした。
その他気になる点として、管理人の環境では初回の発話時のみ「読み上げ始めの文字が若干欠落する」事があるようです。すぐに再度実行すると、キャッシュが残っているのか読み上げ始めの文字も発話に発話していました。
補足:Open JTalkの実行形式・引数
open_jtalkコマンドの実行形式と引数は、以下のとおりです。
- 実行形式
open_jtalk [options] [infile] - 引数
-x dir dictionary directory
-m htsvoice HTS voice files
-ow s filename of output wav audio (generated speech)
-ot s filename of output trace information
-s i sampling frequency [ auto][ 1– ]
-p i frame period (point) [ auto][ 1– ]
-a f all-pass constant [ auto][ 0.0– 1.0]
-b f postfiltering coefficient [ 0.0][ 0.0– 1.0]
-r f speech speed rate [ 1.0][ 0.0– ]
-fm f additional half-tone [ 0.0][ — ]
-u f voiced/unvoiced threshold [ 0.5][ 0.0– 1.0]
-jm f weight of GV for spectrum [ 1.0][ 0.0– ]
-jf f weight of GV for log F0 [ 1.0][ 0.0– ]
-z i audio buffer size (if i==0, turn off) [ 0][ 0– ]
infile text file [stdin]