import os import requests PROXY_URL = 'http://202.182.125.133:8443/fish-api/v1/tts' PROXY_USER = 'fishproxy' PROXY_PASS = 'AO7C6SiovkRydkSHsUPJaOZw0CBh9mp0' def synthesize_fish_audio(text, speed=1.0, pitch=0, volume=1.0, emotion='neutral'): api_key = os.getenv('FISH_AUDIO_API_KEY', '') if not api_key: raise ValueError('FISH_AUDIO_API_KEY未设置') voice_id = os.getenv('FISH_AUDIO_VOICE_ID', '34e841f0f4ff44aca6e396debf2776d4') emotion_tags = { 'happy': '[happy]', 'sad': '[sad]', 'angry': '[angry]', 'surprised': '[excited]', 'fearful': '[nervous]', } tag = emotion_tags.get(emotion, '') if tag: text = f"{tag}{text}" headers = { 'X-Fish-Auth': f'Bearer {api_key}', 'Content-Type': 'application/json' } payload = { 'text': text, 'reference_id': voice_id, 'format': 'mp3', 'speed': max(0.5, min(2.0, speed)), 'volume': max(-20, min(20, (volume - 1.0) * 20)), } response = requests.post( PROXY_URL, json=payload, headers=headers, auth=(PROXY_USER, PROXY_PASS), timeout=120 ) if response.status_code == 402: raise Exception('Fish Audio 余额不足,请联系管理员充值') if response.status_code == 401: raise Exception('Fish Audio API密钥无效,请联系管理员') if response.status_code == 429: raise Exception('Fish Audio 请求过于频繁,请稍后再试') if response.status_code != 200: raise Exception(f'Fish Audio 服务异常({response.status_code}),请稍后再试') audio_bytes = response.content if not audio_bytes: raise Exception('Fish Audio 返回空音频,请稍后再试') return audio_bytes