見出し画像

PythonでのgTTS使い方再確認


読み上げのライブラリ

 暗記関係の自習用アプリ、特に語学関係のそれをこしらえようと思ったら、発音の良い「読み上げ機能」は必須。
 自分は、Python学習しはじめたころ、文法もクラスもモジュール化もよくわかっていない段階で

こんな試行錯誤をした末

と、ようやく動いた関数をなんちゃってライブラリにしました。myspeech_lib.py という名前で以下を保存

import tempfile
import time
from gtts import gTTS
from pygame import mixer

def myspeech(mylang,mytext):
   if mytext != 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',"データが無いようですよ")

クラスでもなく、ただ単に関数一つだけです。
実行する場合は、たとえば
test.py と言う名前で同じフォルダに以下を保存して

from myspeech_lib import myspeech

myspeech("en","Good morning!")
myspeech("zh-TW","早安!")
myspeech("ja","おはよう!")

test.pyを実行すると、"Good morning!"、"早安!"、"おはよう!"、としゃべってくれます。動いてくれるので、このままずっと使ってきました。だけど、ややpythonに慣れてきたところなので、コードを見直しておきたいな、と思った次第。

情報源:

https://gtts.readthedocs.io/en/latest/

最新バージョン2.5.3のリリース日: 2024年8月14日だそうで、頻繁にメンテされているようですね。gTTS、自分のPCに入っていたのはバージョン2.5.1でしたので、更新しました。

使える言語リストの取得

自分が今まで知らなかった使い方として
gtts.lang.tts_langs()
で、使える言語リストがdict型で取得できる、というのがありました。試してみます。

from gtts import lang

print(lang.tts_langs())

{'af': 'Afrikaans', 'am': 'Amharic', 'ar': 'Arabic', 'bg': 'Bulgarian', 'bn': 'Bengali', 'bs': 'Bosnian', 'ca': 'Catalan', 'cs': 'Czech', 'cy': 'Welsh', 'da': 'Danish', 'de': 'German', 'el': 'Greek', 'en': 'English', 'es': 'Spanish', 'et': 'Estonian', 'eu': 'Basque', 'fi': 'Finnish', 'fr': 'French', 'gl': 'Galician', 'gu': 'Gujarati', 'ha': 'Hausa', 'hi': 'Hindi', 'hr': 'Croatian', 'hu': 'Hungarian', 'id': 'Indonesian', 'is': 'Icelandic', 'it': 'Italian', 'iw': 'Hebrew', 'ja': 'Japanese', 'jw': 'Javanese', 'km': 'Khmer', 'kn': 'Kannada', 'ko': 'Korean', 'la': 'Latin', 'lt': 'Lithuanian', 'lv': 'Latvian', 'ml': 'Malayalam', 'mr': 'Marathi', 'ms': 'Malay', 'my': 'Myanmar (Burmese)', 'ne': 'Nepali', 'nl': 'Dutch', 'no': 'Norwegian', 'pa': 'Punjabi (Gurmukhi)', 'pl': 'Polish', 'pt': 'Portuguese (Brazil)', 'pt-PT': 'Portuguese (Portugal)', 'ro': 'Romanian', 'ru': 'Russian', 'si': 'Sinhala', 'sk': 'Slovak', 'sq': 'Albanian', 'sr': 'Serbian', 'su': 'Sundanese', 'sv': 'Swedish', 'sw': 'Swahili', 'ta': 'Tamil', 'te': 'Telugu', 'th': 'Thai', 'tl': 'Filipino', 'tr': 'Turkish', 'uk': 'Ukrainian', 'ur': 'Urdu', 'vi': 'Vietnamese', 'yue': 'Cantonese', 'zh-CN': 'Chinese (Simplified)', 'zh-TW': 'Chinese (Mandarin/Taiwan)', 'zh': 'Chinese (Mandarin)'}

まあ、いっぱいあるけど自分が使うのは、結局
'ja': 'Japanese'
'en': 'English'
'zh-TW': 'Chinese (Mandarin/Taiwan)'
の三つだけです。

自分が引っかかっていたこと

今回見直そうと思ったのは

         while mixer.music.get_busy():
            time.sleep(0.1)

sleep を使っていることに引っ掛かりを感じたからです。
 コードを眺めてみたら、これはgTTSの使い方の問題ではなくて、出来上がったmp3ファイルをpygameのmixerで再生する際の問題でした。
「Pythonでのpygame使い方(mp3ファイル再生方法)の再確認」が本筋ですね。

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