PythonでのgTTS使い方再確認(2)(playsound3版)
前回
でplaysound3モジュールを使ったMP3再生がうまく行ったので、gTTSと組み合わせて新しいライブラリにします。
前のくりかえしになりますが、これまで使っていたライブラリのソースは
import tempfile
import time
from gtts import gTTS
from pygame import mixer
def myspeech(mylang, mytext):
if mytext is not None:
with tempfile.TemporaryFile(delete=True, dir=".", suffix=".mp3") as f:
# 文字列をmp3ファイルに保存
myobj = gTTS(text=mytext, lang=mylang, slow=False)
myobj.write_to_fp(f)
# mp3再生
mixer.init()
f.seek(0)
mixer.music.load(f)
time.sleep(0.3)
mixer.music.play(loops=1)
while mixer.music.get_busy():
time.sleep(0.1)
else:
myspeech("ja", "データが無いようですよ")
# テストコード
def main():
myspeech("en", "Good morning!")
myspeech("zh-TW", "早安!")
myspeech("ja", "おはよう!")
if __name__ == "__main__":
main()
というもの。ここで、pygameを使うのやめる、timeもやめる。
代わりにplaysound3を使う。
そして、こうなりました
import os
import tempfile
from gtts import gTTS
from playsound3 import playsound
def myspeech(mylang, mytext):
if mytext is not None:
with tempfile.NamedTemporaryFile(delete=False, dir=".", suffix=".mp3") as f:
try:
myobj = gTTS(text=mytext, lang=mylang, slow=False)
myobj.write_to_fp(f)
f.close()
# mp3再生
playsound("silent.mp3")
playsound(f.name)
finally:
os.remove(f.name)
else:
myspeech("ja", "データが無いようですよ")
# テストコード
def main():
myspeech("en", "Good morning!")
myspeech("zh-TW", "早安!")
myspeech("ja", "おはよう!")
if __name__ == "__main__":
main()
一時ファイル(tempfile)の delete=False にしておいて自動削除はしないようにする。代わりに、gTTSで作った音声ファイルを明示的にcloseしてからplaysoundで再生、最後にtry finally構文で確実にファイルを削除しています。
なお、音声の「出だし」が欠ける問題があったので、非常に短い無音のmp3ファイルsilent.mp3を用意しておき、これを再生してから続けてgTTSで作った音声ファイルを再生するようにしています。これで冒頭の音欠け問題を回避できました。
さらに検討。以前、気を利かせたつもりで(笑)
if mytext is not None:
という条件をつけていましたが、どうも無意味だったようです(笑)。外してしまいます。
結局こうなりました。
myspeech_lib.py(改)
import os
import tempfile
from gtts import gTTS
from playsound3 import playsound
def myspeech(mylang, mytext):
with tempfile.NamedTemporaryFile(delete=False, dir=".", suffix=".mp3") as f:
try:
myobj = gTTS(text=mytext, lang=mylang, slow=False)
myobj.write_to_fp(f)
f.close()
# mp3再生
playsound("silent.mp3")
playsound(f.name)
finally:
os.remove(f.name)
# テストコード
def main():
myspeech("en", "Good morning!")
myspeech("zh-TW", "早安!")
myspeech("ja", "おはよう!")
if __name__ == "__main__":
main()