見出し画像

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()


いいなと思ったら応援しよう!