import os import hashlib import requests import urllib.parse from translation_data import ( translation_dict_A, translation_dict_B, translation_dict_C, translation_dict_D, translation_dict_F # 必要に応じて translation_dict_E, translation_dict_G などを追加 ) # 設定 AUDIO_VARIANTS = 3 # 各フレーズあたりの音声バリアント数 OUTPUT_DIR = os.path.join('static', 'audio') # 音声ファイルの保存先 HASH_LENGTH = 8 # ハッシュの長さ VOICE_GENERATION_URL = "http://192.168.1.80:5000/voice" # 音声生成APIのURL # バリアントごとの model_id の設定 VARIANT_SETTINGS = { 1: {'model_id': 9}, 2: {'model_id': 11}, 3: {'model_id': 12}, } def generate_truncated_hash(text, length=HASH_LENGTH): """ 指定されたテキストのトランケートされたSHA-256ハッシュを生成します。 Args: text (str): ハッシュ化するテキスト。 length (int): トランケートするハッシュの長さ。 Returns: str: トランケートされたハッシュ文字列。 """ hash_object = hashlib.sha256(text.encode('utf-8')) hex_dig = hash_object.hexdigest() return hex_dig[:length] def create_directory(path): """ 指定されたパスにディレクトリを作成します。存在しない場合のみ作成します。 Args: path (str): 作成するディレクトリのパス。 """ os.makedirs(path, exist_ok=True) def generate_audio(text, model_id): """ 音声生成APIにリクエストを送り、音声データを取得します。 `speaker_id` は固定値 0 を使用します。 Args: text (str): 音声化するテキスト。 model_id (int): 使用するモデルID。 Returns: bytes: 取得した音声データのバイナリ。 """ params = { 'text': text, 'model_id': model_id, 'speaker_id': 0, # speaker_id は常に 0 で問題ない仕様 'sdp_ratio': 0.2, 'noise': 0.6, 'noisew': 0.8, 'length': 1.4, 'language': 'JP', 'auto_split': 'true', 'split_interval': 0.5, 'assist_text_weight': 1, 'style': 'Neutral', 'style_weight': 1 } try: response = requests.get(VOICE_GENERATION_URL, params=params, timeout=30) response.raise_for_status() # HTTPエラーがあれば例外を発生させる return response.content except requests.exceptions.RequestException as e: print(f"Error generating audio for text '{text}': {e}") return None def process_translation_dicts(): """ すべての翻訳辞書を処理し、音声バリアントを生成してフォルダに保存します。 """ # 翻訳辞書のリスト translation_dicts: list[dict[str, str]] = [ translation_dict_A, translation_dict_B, translation_dict_C, translation_dict_D, translation_dict_F # 必要に応じて translation_dict_E, translation_dict_G などを追加 ] for dict_index, translation_dict in enumerate(translation_dicts, start=1): set_identifier = chr(64 + dict_index) # 'A', 'B', 'C', etc. print(f"\nProcessing translation_dict_{set_identifier}") for chinese_sentence, japanese_sentence in translation_dict.items(): # 日本語の文からハッシュを生成 sentence_hash = generate_truncated_hash(japanese_sentence) folder_path = os.path.join(OUTPUT_DIR, sentence_hash) # フォルダを作成 create_directory(folder_path) print(f"Created/Verified directory: {folder_path}") for variant_num in range(1, AUDIO_VARIANTS + 1): settings = VARIANT_SETTINGS.get(variant_num) if not settings: print(f"No settings defined for variant {variant_num}. Skipping.") continue model_id = settings['model_id'] audio_filename = f"variant_{variant_num}.mp3" audio_filepath = os.path.join(folder_path, audio_filename) # 既にファイルが存在する場合はスキップ """ if os.path.exists(audio_filepath): print(f"Audio variant already exists: {audio_filepath}") continue print(f"Generating {audio_filename} with model_id={model_id}, {japanese_sentence}") """ # 音声生成 audio_data = generate_audio(japanese_sentence, model_id) if audio_data: # ファイルに保存 with open(audio_filepath, 'wb') as f: f.write(audio_data) print(f"Saved audio variant: {audio_filepath}, {japanese_sentence}") else: print(f"Failed to generate audio for variant {variant_num} of sentence: {japanese_sentence}") if __name__ == "__main__": process_translation_dicts() print("\nAudio variant generation completed.")