Spaces:
Sleeping
Sleeping
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.") | |