見出し画像

Python日記vol.22🐍ただダジャレを読み上げるだけのアプリ

こんにちは。aliceです。
急に涼しくなったので久しぶりにお番茶を入れました。長時間置いておくとまろやかになるのですが、その前に飲み切ってしまうのが残念です。

今回は、ただダジャレを読み上げるだけのアプリの話です。

せっかく働くなら明るい職場で働きたい、明るい職場を作ろう✨ということで、ダジャレを読み上げるアプリを作りました。
いろいろ書き換えたのでちょっと違うけど、イメージはこちらです。


指定した回数だけ、ランダムにダジャレを読み上げます。
読み上げる間隔も自分で指定します。


いきなりどこからか「布団がふっとんだ」とか聞こえてきたら楽しそうですね。

明る職場計画😀
一歩間違えたら極寒の地になりそうなので、タイミングは大事ですね。

まだ、使っていないので使ってみたら感想でも書きたいと思います。

まずは一息

作ってみる


では、さっそく作ります。

まずは、次のライブラリをpip installします。
pyttsx3は音声の読み上げに使います。

pip install PySimpleGUI
pip install pyttsx3


コードはこちらです。

import random
import time

import PySimpleGUI as sg
import pyttsx3

# ダジャレのリスト
dajare_list = [
    '布団が吹っ飛んだ',
    '猫が寝込んだ',
    'アルミ缶の上にあるミカン',
    '土管の中でドッカーン',
    'チョコをちょこっと',
]


def create_gui():
    """
    GUIを作成する

    :return: window ウィンドウ
    """
    sg.theme('LightGray2')

    # レイアウトの定義
    layout = [
        [sg.Text('回数 ', size=(12, 1)),
         sg.Slider(range=(1, 10), orientation='h', size=(30, 20), key='count_slider', default_value=1)],
        [sg.Text('待機時間(秒): ', size=(12, 1)),
         sg.Slider(range=(1, 10), orientation='h', size=(30, 20), key='slider', default_value=5)],
        [sg.Text('実行状況 ', size=(12, 1)), sg.ProgressBar(100, orientation='h', size=(20, 20), key='progressbar'),
         sg.Text('', size=(12, 1), key='progress_text')],
        [sg.Button('実行'), sg.Button('終了')],
        [sg.Text('_' * 70)],
        [
            sg.Text('', size=(15, 1)),
            sg.Text('', size=(30, 1), key='output'),
            sg.Column([
                [sg.Text('', size=(30, 1), key='output')],
                # 画像を入れるときは同じディレクトリにimage.pngを置いて、下の行のコメントアウトを解除してください
                # [sg.Image(filename='image.png', key='image')],
            ], justification='right')
        ],
    ]

    # ウィンドウの生成
    return sg.Window('ダジャレ読み上げアプリ', layout)


def read_aloud_thread(window, count, sleep_duration):
    """
    ダジャレを読み上げる

    :param window: ウィンドウ
    :param count: 読み上げる回数
    :param sleep_duration: 待機時間
    :return:
    """
    progress_bar = window['progressbar']
    progress_text = window['progress_text']

    engine = pyttsx3.init()
    engine.setProperty('rate', 130)

    for i in range(count):
        dajare = random.choice(dajare_list)  # ランダムにダジャレを選択
        window['output'].update(dajare)  # テキストを表示
        engine.say(dajare)  # テキストを音声に変換
        engine.runAndWait()  # 音声を再生

        # 次のダジャレまで待機
        time.sleep(sleep_duration)

        # プログレスバーを更新
        progress_value = int(((i + 1) / int(count)) * 100)
        progress_bar.update(progress_value)
        progress_text.update(f'{progress_value}% 完了')


def main():
    window = create_gui()

    while True:
        event, values = window.read()

        if event == '実行':
            count = int(values['count_slider'])
            sleep_duration = int(values['slider'])
            window.start_thread(lambda: read_aloud_thread(window, count, sleep_duration), end_key='-THREAD_END-')
        elif event in ('終了', sg.WIN_CLOSED):
            break

    window.close()


if __name__ == '__main__':
    main()


このコードを実行するとこんな画面が立ち上がります。


画像を追加するときは、同じディレクトリ上に「image.png」ファイルを置きます。
次に、reate_gui関数内にあるlayoutの次の部分のコメントアウトを解除してください。

# [sg.Image(filename='image.png', key='image')],


すると、右下に画像が入ります。

いらすとやさん、ありがとう💖



ダジャレはこちらからいただきました。
子供が喜ぶ親父ギャグ30選だそうです。


これをChatGPTにリストにしてもらいました。
上のコードのダジャレは5個なので、もうちょっと増やしたい!という場合は、お好みで追加してください。

dajare_list = [
    '布団が吹っ飛んだ',
    '猫が寝込んだ',
    'アルミ缶の上にあるミカン',
    'トイレに行っといれ',
    '土管の中でドッカーン',
    'チョコをちょこっと',
    'お金はおっかねぇ',
    'ダジャレを言うのは誰じゃ?',
    '画鋲が刺さって、ガビョーン',
    '牛がわらって、うっしっし',
    'イカはいかが?',
    'いくらは幾ら?',
    'カレーはかれぇ!',
    'イルカはいるか?',
    '内容がないよう',
    'ぶどうを一粒どう?',
    '鶴がツルっとすべった',
    '箱を運んだ',
    '電話に出んわ',
    'ワニが輪になる',
    'アタリメはあたりめえだ',
    'お金を取られた おっかねー',
    '車が来るまで車で待つわ',
    'タンスに乗ったんす',
    'チーターが池におっこちーたー',
    'トキが時を変えた',
    'ワシが「わしじゃー!」と言った',
    '神社で飲むジンジャエール',
    '太陽がすごくて目が痛いよう',
    '虫がいても無視しよう'
]


いろいろ試行錯誤


音声読み上げ

最初はgTTSでテキストを音声に変換・mp3形式で保存してから、playsoundを使って読み上げていました。
X(Twitter)の動画はplaysoundで読み上げたものです。

音声的にはこちらの方が好みなのですが、読み上げるだけならpyttsx3の方が簡単かな?と思ってこちらにしてみました。

マルチスレッド

マルチスレッドも最初はimport threadingで作っていたのですが、PySimpleGUIのstart_threadメソッドでもできるとわかったのでこちらに変更しました。

ChatGPTにはthreadingの方が良いよと言われたのですが、使い方が微妙なのかこちらを使うとエラーになるので、まずはstart_threadメソッドにしてみました。

せっかくなので、ごちゃごちゃの思い出を貼っておきます。

ごちゃごちゃの思い出


よかったら、一緒に使ってみませんか?
もちろん、結果はどうなるかわかりません!

参考



この記事が気に入ったらサポートをしてみませんか?