import gradio as gr from openai import OpenAI import os import time audio_format = [".mp3", ".mp4", ".mpeg", ".mpga", ".m4a", ".wav", ".webm" ,".MP3", ".MP4", ".MPEG", ".MPGA", ".M4A", ".WAV", ".WEBM"] lang_code = {'Japanese': "ja", 'English': "en"} mode_code = {'文字': "transcribe", '翻訳': "translate"} max_file_size = 25 * 1024 * 1024 def set_state(openai_key, lang, mode, state): state["openai_key"]= openai_key state["lang"] = lang_code[lang] state["mode"] = mode_code[mode[0:2]] return state def create_textfile(voice_msg, up_file ,state): # OpenAIキーチェック if state["openai_key"] == "": err_msg = "OpenAIキーを入力してください。(設定タブ)" return voice_msg, up_file, "", None, err_msg # ファイル入力チェック if up_file is None and voice_msg is None: err_msg = "マイクかファイルで音声を入力してください。" return None, None, "", None, err_msg # アップロードの場合ファイルチェック if voice_msg is None: # ファイルパスなど取得 file_name = os.path.splitext(os.path.basename(up_file.name))[0] root, ext = os.path.splitext(up_file.name) if ext not in audio_format: # ファイル形式チェック err_msg = "指定した形式のファイルをアップしてください。(mp3, mp4, mpeg, mpga, m4a, wav, webm)" return None, None, "", None, err_msg file_size = os.path.getsize(up_file.name) if file_size >= max_file_size: # ファイルサイズチェック err_msg = "ファイルが大きすぎます。25MB未満にして下さい。" return None, up_file.name, "", None, err_msg # 音声ファイルセット if voice_msg: audio_file= open(voice_msg, "rb") else: audio_file= open(up_file.name, "rb") try: # whisperで変換処理 os.environ["OPENAI_API_KEY"] = state["openai_key"] # クライアント新規作成 client = OpenAI() # client作成後は消す os.environ["OPENAI_API_KEY"] = "" if state["mode"] == "transcribe": # 文字起こし実行 trans_text = client.audio.transcriptions.create(model="whisper-1", file=audio_file ,language = state["lang"], response_format="text") else: # 翻訳文字起こし実行 trans_text = client.audio.translations.create(model="whisper-1", file=audio_file, response_format="text") # ファイル名設定 if voice_msg: trans_file = trans_text[:8] + "_whisper.txt" else: trans_file = file_name + "_whisper.txt" with open(trans_file, mode="w") as f: # テキストに書き出す f.write(trans_text) return None, None, trans_text, trans_file, "" except Exception as e: return voice_msg, None, "", None, e def wait_mic_process(): # 録音後処理に時間がかかるので待つ time.sleep(1) return gr.update(interactive=True) with gr.Blocks() as demo: title = "