本記事ではPythonで音声データの作成や再生をする手順について説明します。
具体的には以下の通りです。
・PythonでOpen JTalkを操作して音声を作成する方法
・Pythonで音声を再生する方法
・Pythonで音声を作成・再生する処理を実装例と実行例
音声の作成はOpen JTalkなどのフリーソフトを活用すれば比較的簡単に実装することができます。
また、再生もOSのコマンドやPython標準ライブラリで実行可能ですので、実装も難しくありません。
本記事の内容も参考にしつついろいろ作成してみてください。
目次
PythonでOpen JTalkを操作して音声を作成する方法
音声ファイルは「Open JTalk」などの音声作成ソフトをPythonで操作することで作成可能です。
今回は「Open JTalk」を活用した実装例について紹介します。
Open JTalkとは?
Open JTalkはテキストを音声データに変換することができるフリーソフトです。
コマンドラインの操作で簡単に音声データを作成することができます。
辞書ファイルを指定すれば漢字や英語も自然な発音で読むことが可能です。
デフォルトでは漢字の読みは登録されていますが、英単語は登録されていないので英単語が追加登録する必要があります。
Open JTalkのインストール
Macにインストール方法はbrewコマンドを使用すればOKです。
Windowsはビルドが必要なので少し面倒です。
以下の記事を参考にしつつビルドしてください。
Windowsで音声合成Open JTalk
音声合成Open JTalkのインストール[On Windows 10]
Open JTalkの使い方
コマンドラインで以下のように指定します。
上記コマンドを実行するとwavファイルが作成されます。
パラメータの概要は以下の通りです。
辞書ファイル:漢字やアルファベットの読み方を定義するファイルです。
音声ライブラリ:音声を出力するためのライブラリ、男性の声や女性の声などいろいろな種類があります。出力ファイル:読み上げた音声を記録したファイル
テキストファイル:読み上げる文章を書いたファイル(Macの場合は、UTF-8、Windowsの場合はSJIS)
Open JTalkをPythonで操作する方法
Open JTalkの操作は「os.system」で行えます。
1 2 3 4 | import os os.system( open_jtalk -x [辞書ファイル] -m [音声ライブラリ] -ow [出力ファイル] [テキストファイル] ) |
Pythonで音声を再生する方法
afplayコマンドなど音声再生コマンドをPythonで操作することで音声を再生することができます。
また、Windowsの場合は「winsound」というライブラリで音声を操作可能です。
Python+afplayで音声ファイル(wav)を再生する方法
afplayコマンドはMacOSで音声を操作するためのコマンドです。
Pythonでafplayコマンドを操作する場合、Open JTalkの操作と同様「os.system()」を使用します。
1 2 | import os os.system('afplay [音声ファイル]') |
winsoundライブラリで音声を再生する方法
Windowsの場合は「winsound」ライブラリで再生することができます。
再生には「winsound.PlaySound()」メソッドを使用します。
引数1:読み込む音声ファイルデータ(open()関数でファイルを開いて指定)
引数2:データフラグ
1 2 3 4 | import winsound with open('out.wav', 'rb') as f: data = f.read() winsound.PlaySound(data, winsound.SND_MEMORY) |
winsoundの使い方については公式ドキュメントもあわせてお読みください。
公式ドキュメント>>winsound --- Windows 用の音声再生インタフェース
Pythonで音声を作成・再生する処理を実装例と実行例
Python+Open JTalkで音声作成から再生までの実装例について紹介します。
2020/02/27修正:Windowsに対応したコードに修正しました。
OS情報を取得
OSによって文字コードや音声ソフトが異なるので処理を切り分けるのがおすすめです。
PythonでOSを取得する場合はplatformライブラリを使用します。
1 | _os = platform.system() |
音声ファイルの作成
まずは指定した文字列をテキストファイルに出力します。
1 2 3 4 | # ファイルにテキストを書き込む target_file = codecs.open(self.talk_file, 'w', self.character_code) target_file.write(text) target_file.close() |
「open_jtalk」コマンドを実行して音声ファイルを作成します。
1 2 3 | os.system('open_jtalk -x %s -m %s -ow %s %s' % (self.dic_dir, self.voice_dir, self.wav_file, self.talk_file)) |
音声の再生
再生処理はOSによって切り分けが必要です。
OSが「Windows」の場合は「winsound」ライブラリ、それ以外の場合は「afplay 」コマンドでの再生としています。
1 2 3 4 5 6 7 | # OSによって処理を切り分け if self.os == 'Windows': with open('out.wav', 'rb') as f: data = f.read() winsound.PlaySound(data, winsound.SND_MEMORY) else: os.system('afplay out.wav') |
今回はWindowsとMacで使うことを想定しているので2パターンのみですが、他のOSで使う場合はパターンを増やしましょう。
実装例と実行例
実装例と実行例は以下の通りです。
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 | import os import codecs import platform import winsound class JTalk: def __init__(self, talk_file, wav_file, dic_dir, voice_dir): # Open JTalkの設定 self.talk_file = talk_file self.wav_file = wav_file self.dic_dir = dic_dir self.voice_dir = voice_dir self.enabled = 'off' # OSとファイル形式の設定 self.os = platform.system() if self.os == 'Windows': self.character_code = "sjis" else: self.character_code = "utf_8" # 音声ファイル作成メソッド def set_talk(self, text): # ファイルにテキストを書き込む target_file = codecs.open(self.talk_file, 'w', self.character_code) target_file.write(text) target_file.close() # Open JTalkの実行 os.system('open_jtalk -x %s -m %s -ow %s %s' % (self.dic_dir, self.voice_dir, self.wav_file, self.talk_file)) # 音声再生メソッド def exe_talk(self, text): self.set_talk(text) # OSによって処理を切り分け if self.os == 'Windows': with open('out.wav', 'rb') as f: data = f.read() winsound.PlaySound(data, winsound.SND_MEMORY) else: os.system('afplay out.wav') def main(): # 辞書ディレクトリ dic_dir = "C:UsersxxxxDocumentsopen_jtalk-1.11mecab-naist-jdic" # Voiceファイル voice_dir = 'C:UsersxxxxDocumentsopen_jtalk-1.11Voicemeimei_normal.htsvoice' talk_file = 'talk.txt' # 読み上げる文章を書き込むファイル wav_file = 'out.wav' # 音声の出力ファイル text = 'ブルータスよ、お前もか' # message.send(reply)→音声の順に処理すると同時再生っぽくなります jtalk = JTalk(talk_file, wav_file, dic_dir, voice_dir) jtalk.exe_talk(text) if __name__ == "__main__": main() |
◆実行例
以下の音声が再生されます。
終わりに
今回は以下の3つの方法について紹介しました。
・PythonでOpen JTalkを操作して音声を作成する方法
・Python+afplayで音声ファイル(wav)を再生する方法
・Pythonで音声を作成・再生する処理を実装例と実行例
「Open JTalk」を活用すればPythonでも音声作成が簡単にできます。あとはOSのコマンドを操作して音声を再生するだけです。
日本語の文章を作成して読み上げるだけであれば比較的簡単に実装できます。
今回紹介した方法を参考にしていろいろな音声を作成してみてください。
関連記事>>Pythonでテキストを読み上げる方法
◆おすすめ記事
Pythonでファイルの読み書きを制御する
PythonでCSVファイルを出力する方法
PythonでCSVファイルを出力する方法
Pythonのファイル操作まとめTOP>>Pythonでファイルを操作する方法まとめ