pythonでdebugログを音声出力にすると意外と便利だね という話
突然ですが、AI(機械学習)のプログラミングをしていて思いついた話で
AIの記事じゃない?です。
ちょっとpython(じゃなくてもいいですが)のプログラミングの話で、更に長時間の処理などを実行している人などにお勧めの話なので読む人がだいぶ限られるかもしれませんが。。この発想は今まで何故か無かったなぁと思いまして、最近、個人的にやっている。デバッグログや警告などを音声出力させるのが意外と便利だったのでちょっと紹介したいと思います。
※会社で「処理が完了したのだ」とか言ってたら怒られますが
いつも機械学習の処理が時間かかる&いつ終わったのかも分からんので、youtubeでも見ながら待って、ずんだもんに「すべての処理が完了したのだ。おつかれさまなのだ」と音を出すようにしていたのですが、気が付いたら色々しゃべらすようにしてました。という話です。
「ずんだもん」にしゃべらせる【おすすめ】
ずんだもんのWAVファイルは、以下の「VOICEVOX」をインストールすれば超簡単に作れます。ずんだもん以外にも何人かの音声が作れます。本当に簡単で説明不要です。私はJRAVANの警告音にも使ってますw
以下、VOICEVOX、ずんだもんのサンプルで
「すべての処理が完了したのだ。おつかれさまなのだ」
コードはこんな感じで、処理の最後に入れていましたが、何でもしゃべってくれるので、音声内容は固定になりますが、いろいろなアラートとかも作れます「エラーなのだ!」とか。あと「VOICEVOX」はデーモン化してくれる仕組みもあり、APIでリアルタイムに自由にしゃべらすことも可能です(毎回、立ち上げるのも面倒なのでやってませんがw)
import pygame
def allend_alert():
pygame.mixer.init()
pygame.mixer.music.load("./WAV/ALLEND.wav")
pygame.mixer.music.play()
# 終了を待つ
while pygame.mixer.music.get_busy():
continue
allend_alert()
↓ こちらはデーモン化(常駐してくれる)voicevox_engineです
「googleちゃん」にしゃべらせる(gTTS)【おすすめ】
次に「gTTS」(Google TTS ライブラリ)です。
一番自然で「ずんだもん」と異なり、その場で音声を生成してくれるので何でもリアルタイムで読み上げてくれるのですが、漢字をいつも読み間違えるのでpykakasiを混ぜて、一度ひらがなに変換させています。
関数化しているので Sub.speak_text("おまえ、やっちまったな。エラーですよ。") でしゃべります。
また、通常、一度mp3などで一時的に保存するのですが、煩わしいので保存せずにメモリ上に記録して再生できます。以下サンプルで、メモリ上に記録してLGBM処理時間を通知させてます。セリフは普通の内容にしてますが、実際、私が使っているコードです。
※ ↓ ログ付 & pyKakasi & メモリ記録のコンビ
from gtts import gTTS
import pykakasi
def speak_text(text: str):
print("#########################################################")
print(f"{text}")
print("#########################################################")
# 漢字をひらがなに変換
kakasi = pykakasi.kakasi()
result = kakasi.convert(text)
converted_text = "".join([item['hira'] for item in result])
# 音声を生成して再生
pygame.mixer.init()
mp3_fp = io.BytesIO()
gTTS(converted_text, lang='ja').write_to_fp(mp3_fp)
mp3_fp.seek(0)
pygame.mixer.music.load(mp3_fp, 'mp3')
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
pass
start_time = time.time()
# LGBM処理・・・
end_time = time.time()
elapsed_time = end_time - start_time
speak_text(f"おつカレー。LGBM {elapsed_time:.0f}sec で、やっと処理が終わったよぉぉぉぉ")
標準的な音声(pyttsx3)
次に、「pyttsx3」です。これは昔ながらのパソコンから出るような声でいまいちでした。「SAPI5」 と 「espeak」 というエンジンも使えるようです。「ppttsx3」は試しましたが、他はサンプルを聞いたらいまいちで、もうインストールすら面倒と感じてしまったのでやってません。。。以下でググるとサンプルがどこかで聞けるかと思いますw
※右クリックで検索用
pyttsx 日本語 サンプル
SAPI5 日本語 サンプル
espeak 日本語 サンプル
def speak_text(text: str):
engine = pyttsx3.init() # エンジンの初期化
engine.setProperty('rate', 150) # 読み上げ速度を設定(デフォルト: 200)
engine.setProperty('volume', 1) # 音量を設定(0.0 〜 1.0)
engine.say(text) # 音声を読み上げ
engine.runAndWait() # 読み上げを実行
# 使用例
speak_text("こんにちは、Pythonでテキストを読み上げています。")
その他とまとめ
「speech_recognition」を使えば、音声認識&音声出力が可能なので、声で指示も出せるそうです「終了!」などの指示とか。
あとは linuxであれば「festival」「pico2wave」などもあるようですが、今は環境が無いので試さなかったです。
また音量については「EarTrumpet」 などインストールしておけば Python の音量だけ大きくすることなどが簡単に可能です。
これなら youtube を見ながら放置していても、処理の終了に気が付けます!!
pythonはいろいろライブラリが揃っているので非常に簡単に作れますね。
これで処理実行後は放置して、処理が終わったり、エラーになったらすぐに気が付けます!!