一つ前の記事では、MacでPythonを使って日本語の音声認識の方法を説明しました。今回はその続きとして、音声合成、つまりテキストデータをもとに、音声での発音のさせ方を説明していきます。
ライブラリにはpyttsx3を使用しました。日本語の音声合成ライブラリとしては名古屋工業大学さんのOpenJtalkが有名ですが、日本語にしか対応していないこと、更新が2018年7月以降されていないようであることなどを理由に、今回は使用を控えました。
また、古い記事の中にはpytttsxを使用して説明している記事がありますが、pyttsx3を使用してくださいね。
この記事を読んで、できるようになる事
Mac上のPythonにて、ライブラリpyttsx3を用いて、オフライン環境で日本語のテキストデータを音声に変換して発音させることが出来ます。また、英語をはじめとして多言語にも対応していますので、パラメータの変更により、多言語に対応できます。
また、前記事の【オウム返し by Mac その1:音声認識編】と合わせて読んでいただくことにより、Macに日本語の音声で話しかけ、それを認識させてテキストデータ化させ、そのデータを音声合成により発音させてインプットできるようになります。
もちろんこれだけでは、ほとんど何の意味のないコードですが、みなさんが作られているアプリのインターファイスとして使っていただけます。
また、興味を持って、機械学習やプログラミングに始めたばかりの方には、コンピュータを使って自分ができる実装の一例として経験していただければと思います。
環境設定
ぼくの環境は以下の通りです。
- OS : MacOS Mojave 10.14.6
- Python : version 3.6.5
- Hardware : MacBook Pro 2016
- IDE : Jupyter Lab
近くに適当なWindowsのコンピュータがないので、確認はしていませんが、Windowsでもこれから説明するコードは動くはずです。
音声合成
概要説明
今回使用する音声合成のためのライブラリ”pyttsx3"は以前の記事で解説しました"speech_recognition"と異なり、オフラインで使用できます。
この"pyttsx3"の本家サイトへのリンクを以下に貼っておきます。英文ですが、興味のある方は参考にしてみてください。
実装
それでは実際に実装していきます。
1 2 |
# pyttsx3のinstall !pip install pyttsx3 |
それでは、前回の記事と同じようにJupyter Labを開いて上記のコードを打っていきます。
上記のコードによりpyttsx3をインストールします。MacのターミナルやWindowsのコマンドプロンプトから入力する場合は!pipの"!"を省略してください。
また、一行目の"#"から始めるコードはコメントといって注意書きで実際にコンピュータは実行しません。Pythonでは"#"を使うとその行の行末までが、コメントになります。
2020年12月14日追記:
pyttsxのバージョン2.9と2.8にはどうやらバグがあるようで、場合によっては上記の方法では、エラーを吐き、インストールできない場合があるようです。
1 |
<span class="ansi-red-fg">ERROR: Command errored out with exit status 1:</span> |
インストール中に上記のエラーが出た場合は、以下のコマンドを実行してバージョン2.7をインストールしてください。
1 2 |
# pyttsx3のinstall !pip install -U pyttsx3==2.7 |
追記終わり。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import pyttsx3 def TextToSpeech_pyttsx3(ph): engine = pyttsx3.init() voices = engine.getProperty('voices') engine.setProperty("voice", voices[18].id) engine.say(ph) engine.runAndWait() text = "こんにちは" TextToSpeech_pyttsx3(text) |
上記のコードで、変数textに代入した日本語「こんにちは」を発音します。また、声の性質はここのパラメーターで細かく設定できるのですが、ここでは、voicesに登録された声の性質の19番目(7行目に18とある番号でこの性質が呼び出されます。一番目の声の性質の番号が”0”であるため、18は19番目になります。)を使っています。
また、もちろん「こんにちは」を別の日本語の文字列に変換しても、正しく発音してくれます。
興味のある方は、変数textに英語の文字列を代入して、(日本語のテキストデータを発音できる声の性質が少ない為)7行目の番号を色々と変えてコードを実行して色々の声の性質を試してみてください。
音声認識 + 音声合成 = オウム返し
それでは、前回の記事で解説した音声認識のコードと今回開設した音声合成のコードを合体させて、オウム返しのコードを作ります。
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 |
import speech_recognition as sr import subprocess import tempfile import pyttsx3 # 音声合成 def TextToSpeech_pyttsx3(ph): engine = pyttsx3.init() voices = engine.getProperty('voices') engine.setProperty("voice", voices[18].id) engine.say(ph) engine.runAndWait() # 音声入力 while True: r = sr.Recognizer() with sr.Microphone() as source: print("何かお話しして下さい。") audio = r.listen(source) try: # Google Web Speech APIで音声認識 # text = r.recognize_google(audio, language="ja-JP") text = r.recognize_google(audio, language="ja-JP") except sr.UnknownValueError: print("Google Web Speech APIは音声を認識できませんでした。") except sr.RequestError as e: print("GoogleWeb Speech APIに音声認識を要求できませんでした;" " {0}".format(e)) else: print(text) TextToSpeech_pyttsx3(text) print("--------------------") if text == "終わりだよ": break print("完了。") |
上記のコードで、音声により入力された日本語のデータが音声認識によりテキストデータに変換され、それを音声合成により音声に戻して、日本語として発音しています。
前回の音声認識のコードと同様に、「終わりだよ」という入力を認識すると、ループを抜き出て処理を終えます。
まとめ
これで、音声合成の記事は終わりです。前回の音声認識の記事と合わせて、オウム返しのコードが完成しました。
いかがだったでしょうか。思いの外、簡単だったのではないかと思います。20年前にこれと同じことをコンピュータにさせるようと思うと、かなり大掛かりな段取りが必要だったように思います。
それでは最後まで、お付き合いありがとうございました。今回はここまでにいたします。さようなら。
参照資料
本記事の制作のために、以下の資料を参考にしていただきました。
コメント