という疑問に答えます。
PythonはOpen-Jtalkを使うことでテキストの読み上げが可能です。
今回はPythonでテキストファイルを読み上げる方法について紹介します。
具体的には以下の2点です。
・Pythonでテキストを読み上げる手順
・Pythonで複数のファイルを読み上げる方法
Pythonで音声を作成する方法と再生する方法については「Python+Open JTalkで音声を操作する方法」も併せてお読みください。
目次
Pythonでテキストを読み上げる手順
Pythonでテキストを読み上げるためには以下の手順が必要です。
・読み上げるテキストファイルを用意
・音声ファイルを作成する
・音声ファイルを再生する
読み上げるテキストファイルを用意
Pythonで読み上げたいテキストファイルを用意します。
書かれている内容は何でもOKです。元々の辞書でも大抵の漢字は読めるので日本語で書いた文章であればほぼそのままでもOKです。
ただし、英単語などはそのままだと読めません。
以下のいずれかの方法で対応する必要があります。
1.英語表記をカタカナ(ひらがなでもOK)で書く
2.Pythonのコード上で変換する
3.Mecabで辞書を作成する
今回は「2.Pythonのコード上で変換する」で実装します。
※Mecabは漢字や英語の読み方が登録されたオープンソースの辞書ツールです。
プログラムに組み込むことで辞書に登録されたパターンから漢字や英語をルビに変換できます。
ルビだけでなく発音のイントネーションなど音声で読み上げる時の情報も登録されています。
詳細は「MeCab公式サイト」を参照してください。
音声ファイルを作成する
Pythonで音声するためには「os.system()」メソッドで「Open-jtalk」を操作します。
記述方法は以下の通りです。
1 2 3 4 | import os os.system( open_jtalk -x [辞書ファイル] -m [音声ライブラリ] -ow [出力ファイル] [テキストファイル] ) |
音声ファイルを再生する
音声を再生する場合は、「os.system()」メソッドでafplayコマンドを使用します。
記述方法は以下の通りです。
1 2 | import os os.system('afplay [音声ファイル]') |
テキスト読み上げの実装例
テキスト読み上げの実装例は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import os import codecs import glob class JTalk: def __init__(self, talk_file, wav_file): # 読み上げるファイル self.talk_file = talk_file # 音声ファイル self.wav_file = wav_file # 辞書ファイル self.dic = '/usr/local/Cellar/open-jtalk/1.10_1/dic' # 音声ライブラリ self.voice = '/usr/local/Cellar/open-jtalk/1.10_1/voice/mei/mei_normal.htsvoice' # 辞書の定義 self.user_dic = { 'Slack': 'スラック', 'Todoist': 'トゥードゥーイスト', 'Python': 'パイソン', 'GitHub': 'ギットハブ', 'Open JTalk': 'オープンジェイトーク', } # 音声ファイル作成メソッド def set_talk(self, text): # テキストファイルを開く target_file = codecs.open(self.talk_file, 'w', "utf_8") target_file.write(text) target_file.close() # open-jtalkで音声を作成 os.system('open_jtalk -x %s -m %s -ow %s %s' % (self.dic, self.voice, self.wav_file, self.talk_file)) # 音声再生メソッド def exe_talk(self, param_text): # 読み仮名置き換えメソッド呼び出し text = self.replace_kana(param_text) # 音声を作成するメソッド呼び出し self.set_talk(text) # 音声を再生する os.system('afplay out.wav') # ユーザー定義辞書を置き換える def replace_kana(self, param_text): text = param_text # 「。」を改行(文章の区切り)に置き換える text = '。'.join(text.split('n')) for k, v in enumerate(self.user_dic): text = text.replace(v, self.user_dic[v]) return text def main(): target_file = 'paragraphs/test1.txt' talk_file = 'talk.txt' # 読み上げる文章を書き込むファイル wav_file = 'out.wav' # 音声の出力ファイル # message.send(reply)→音声の順に処理すると同時再生っぽくなります jtalk = JTalk(talk_file, wav_file) c = codecs.open(target_file, "r", "utf_8") # ファイルを読み込む text_lines = c.read() jtalk.exe_talk(text_lines) c.close() if __name__ == "__main__": main() |
テキストファイル(test1.txt)の内容
こんにちは
◆実行例
複数のファイルを読み上げる方法
複数のテキストファイルを一度に再生したい場合もあると思います。
複数のファイルを読み込む場合には「globライブラリ」を使用します。
「paragraphs/」というディレクトリにある全てのテキストファイルを読み上げたい場合には以下のように指定。
1 | files = sorted(glob.glob('paragraphs/*')) |
実装例は以下の通りです。
クラスやメソッドはそのままで「main()」の部分だけ書き換えればOK。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | def main(): talk_file = 'talk.txt' # 読み上げる文章を書き込むファイル wav_file = 'out.wav' # 音声の出力ファイル # message.send(reply)→音声の順に処理すると同時再生っぽくなります jtalk = JTalk(talk_file, wav_file) # ディレクトリの全てのテキストファイルを読み込む files = sorted(glob.glob('paragraphs/*')) for file in files: # ファイルを開く c = codecs.open(file, "r", "utf_8") # ファイルを読み込む text_lines = c.read() jtalk.exe_talk(text_lines) c.close() if __name__ == "__main__": main() |
◆テキストファイル(paragraphs/test1.txt)の内容
こんにちは
◆テキストファイル(paragraphs/test2.txt)の内容
こんばんは
◆実行例
まとめ
Pythonでテキストの読み上げをさせたい場合はopen-jtalkを使うことで可能です。
元々の辞書でも大抵の漢字は読めるので日本語で書いた文章であればそのまま読めることも多いと思います。
英単語などはそのままでは読めないので以下のいずれかの対応が必要です。
1.英語表記をカタカナ(ひらがなでもOK)で書く
2.Pythonのコード上で変換する
3.Mecabで辞書を作成する
今回はPython内で変換しましたが、辞書の拡張性を考えるとMeCabで対応するのがおすすめです。
MeCabでの実装方法については機会があれば書く予定です。
Pythonのファイル操作まとめTOP>>Pythonでファイルを操作する方法まとめ