前回の記事でRaspberry Piにマイクで入力した音声をWhisperで文字に起こしました。
音声をテキストに変換し、それをGPTやGoogleのSearch APIに投げれば、Raspberry Piを音声アシスタントとして使えそうです。
しかし、音声アシスタントを完成するには、アシスタントがしゃべれなくてはいけません。
そこで今回は、Raspberry Piにテキストの読み上げをさせてみます。
Pythonを使ってテキストを読み上げ音声に変換する方法としては「gTTS」やGoogle Cloudの「Text to Speech」がよく紹介されますが、今回はOpenJTalkのPythonラッパーである「pyopenjtalk」を使ってテキストを読み上げさせます。
pyopenjtalkとは?
OpenJTalkは名古屋工業大学で開発されたText To Speechソフトウェアです。
文字通り、テキストをスピーチに変換するためのソフトウェアです。
pyopenjtalkはOpenJTalkをPythonでラップしたもので、数行のコードでテキストを読み上げ音声に変換できます。
これを使ってテキストを読み上げさせましょう。
実行環境
実行環境は以下の通りです。
- Raspberry Pi 4
- Linux raspberrypi 5.15.84-v8+ #1613 SMP PREEMPT Thu Jan 5 12:03:08 GMT 2023 aarch64 GNU/Linux
- Python 3.9.2
- pyopenjtalk 0.3.0
pyopenjtalkを使う
以下でRapsberryPiにpyopenjtalkをインストールします。
sudo apt install cmake
pip install scipy
pip install pyopenjtalk
以下のコードでテキストの読み上げ音声をwavファイルに書き込みます。
import pyopenjtalk
from scipy.io import wavfile
import numpy as np
x, sr = pyopenjtalk.tts("おめでとうございます")
wavfile.write("talk.wav", sr, x.astype(np.int16))
talk.wavというファイルが生成され、ここに「おめでとうございます」というテキストの読み上げ音声が入っています。
これを再生してみましょう。
aplay talk.wav
実際のファイルが以下です。
きれいに読み上げできています。
Marineを使う
marineオプションを使用すると日本語のアクセントの推定にMarineを使用できるそうです。
pip install pyopenjtalk[marine]
上記のコマンドでmarineをインストールした後、run_marineオプションをTrueに設定します。
pyopenjtalk.tts("テキスト", run_marine=True)
ここではmarineオプションをつけた場合とつけなかった場合でアクセントの違いを比較してみます。
import pyopenjtalk
from scipy.io import wavfile
import numpy as np
x, sr = pyopenjtalk.tts("今日の天気は晴れ。最高気温は28度です。", run_marine=False)
wavfile.write("talk.wav", sr, x.astype(np.int16))
x, sr = pyopenjtalk.tts("今日の天気は晴れ。最高気温は28度です。", run_marine=True)
wavfile.write("talk_marine.wav", sr, x.astype(np.int16))
RaspberryPiでは以下のコマンドでそれぞれ再生できます。
marineオプションなし
aplay talk.wav
marineオプションあり
aplay talk_marine.wav
ほとんど同じに聞こえますが、よく聴き比べると「28度」のアクセントが変わっていることがわかります。
どちらかというと「marineオプションなし」のほうが自然に聞こえます。
回答が長文になった場合にどちらがいいかは試してみたいところですが、短文であればオプションなしでもよさそうです。
今回は、音声アシスタントとして簡単なテキストの読み上げができれば十分なので、あまり深堀りせずオプションなしのまま使用することとします。
まとめ
以上、Raspberry Pi環境でテキストを読み上げさせる方法として、OpenJTalkのPythonラッパーであるpyopenjtalkを紹介しました。
実装は数行のコードで完結するためかなり簡単です。
読み上げの精度も良好でした。
テキストの読み上げに困っていたらぜひ使ってみてください。
記事の内容にわからないことがある方は以下のアカウントに気軽にDMしてください!
また、最新の技術の活用方法など役に立つツイートを心がけているので、ぜひフォローしてもらえると嬉しいです!