import gradio as gr import pandas as pd import zipfile import base64 import os import requests import re def remove_quotes(text): # ダブルクォートを空文字に置き換える return text.replace('"', '') def text_to_speech(input_file,selected_option): # APIキーを直接コードに埋め込む(実際の運用では推奨されません) api_key = 'AIzaSyAEzK5_n6zKTimD9yoXS-C8O0xN_4LaVBQ' # ここを実際のAPIキーに置き換えてください data = pd.read_csv(input_file) zip_path = 'output_audio_files.zip' with zipfile.ZipFile(zip_path, 'w') as z: for idx, row in data.iterrows(): # script列が文字列か確認し、文字列でない場合は空文字に置き換える script = row.get('script', '') if not isinstance(script, str): script = str(script) # テキストをA:やB:で分割 parts = re.split(r'(A:|B:)', script) print(parts) ssml_parts = [] print(parts) # 交互に発言するAとBの内容を順に処理 for i in range(1, len(parts), 2): if parts[i] == "A:": voice_name = row["voiceA"] print("A") elif parts[i] == "B:": voice_name = row["voiceB"] else: print("空白") continue # A:またはB:で始まらない行は無視 text = parts[i + 1].strip() text = remove_quotes(text) print("テキスト",text) # 1sに変換する前に除外するコード text = text.replace("a.m.", 'AM') text = text.replace("p.m.", 'PM') text = text.replace("U.S.", 'US') text = text.replace("U.K.", 'UK') text = text.replace("Mr.", 'Mister') text = text.replace("Ms.", 'MIZ') text = text.replace("Mrs.", 'Misiz') text = text.replace("Dr.", 'Doctor') text = text.replace("Mt.", 'Mount') # テキスト内の改行を1sの間に変換 text = text.replace("\n", '') text = text.replace(".", '.') if selected_option == "ブレイクタイム有": # 「,」で時間を空ける if row["eikenn"] in ["5級","4級","3級","準2級","2級","準1級"]: text = text.replace(",", '') print("タグ処理") else: pass ssml_parts.append(f'

{text}

') print(ssml_parts) ssml = '' + ''.join(ssml_parts) print(ssml) if pd.notna(row.get('question')) and row['question'] != '': ssml += f'

Question

{row["question"]}

' # Choices部分の追加 if pd.notna(row.get('choices')) and row['choices'] != '': choices_list = row['choices'].split('/') choices_ssml = ''.join(choices_list) ssml += f'

{choices_ssml}

' ssml += '
' print(ssml) # APIリクエスト用のボディ body = { "input": {"ssml": ssml}, "voice": {"languageCode": "en-US"}, # 基本的な言語設定(必要に応じて行ごとに変更可能) "audioConfig": {"audioEncoding": "MP3"} } headers = { "X-Goog-Api-Key": api_key, "Content-Type": "application/json" } url = "https://texttospeech.googleapis.com/v1/text:synthesize" response = requests.post(url, headers=headers, json=body) print("レスポンス",response) response_data = response.json() print("レスポンスデータ",response_data) # 音声コンテンツの取得とファイル保存 if 'audioContent' in response_data: audio_content = base64.b64decode(response_data['audioContent']) file_name = f"{row['id']}.mp3" with open(file_name, "wb") as out: out.write(audio_content) z.write(file_name) os.remove(file_name) else: print("ファイル不備") return zip_path