🍣

自分用copilot生成 asyncioエラー解消

2024/06/13に公開

もちろんです。別のアプローチとしては、asyncioTaskオブジェクトを使用して非同期タスクを管理する方法があります。以下にその例を示します。

from voicevox_adapter import VoicevoxAdapter
from play_sound import PlaySound
import pyvts
import asyncio
import customtkinter as ctk

input_str = "こんにちは"
va = VoicevoxAdapter()
ps = PlaySound("スピーカー")
data,rate = va.get_voice(input_str)
app = ctk.CTk()
app.geometry("400x240")

plugin_info = {
    "plugin_name": "trigger hotkey",
    "developer": "OverHome",
    "authentication_token_path": "./pyvts_token.txt"
}

async def voice():
    ps.play_sound(data,rate)

async def main():
    myvts = pyvts.vts(plugin_info=plugin_info)
    await myvts.connect()
    await myvts.request_authenticate_token()  # get token
    await myvts.request_authenticate()  # use token
    response_data = await myvts.request(myvts.vts_request.requestHotKeyList())
    hotkey_list = []
    for hotkey in response_data['data']['availableHotkeys']:
        hotkey_list.append(hotkey['name'])
    send_hotkey_request = myvts.vts_request.requestTriggerHotKey(hotkey_list[0])  
    return myvts,send_hotkey_request

myvts, send_hotkey_list = asyncio.run(main())

async def doing():
    await asyncio.sleep(5)
    await myvts.request(send_hotkey_list)
    await voice()

def doing_def():
    task = asyncio.create_task(doing())
    asyncio.get_event_loop().run_until_complete(task)

button = ctk.CTkButton(app,
                       text="実行",
                       command=doing_def,
                       width=200,height=120)
button.grid(column=2,row=1)

app.mainloop()

このコードでは、asyncio.create_task(doing())を使用して新しいタスクを作成し、そのタスクをasyncio.get_event_loop().run_until_complete(task)で実行しています。これにより、WebSocket接続が適切に閉じられるまでイベントループが開いたままになります。

ただし、この修正がすべての問題を解決するわけではない可能性があります。他にも問題が発生する場合は、詳細な情報を提供してください。よろしくお願いいたします。

Discussion