59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
"""
|
||
TTS 服务:文字转语音
|
||
"""
|
||
import base64
|
||
import os
|
||
from io import BytesIO
|
||
|
||
from openai import OpenAI
|
||
|
||
|
||
class TTSService:
|
||
"""TTS 服务(文字转语音)"""
|
||
|
||
def __init__(self):
|
||
api_key = os.getenv("OPENAI_API_KEY", "")
|
||
if api_key:
|
||
self.client = OpenAI(api_key=api_key)
|
||
else:
|
||
self.client = None
|
||
|
||
async def synthesize(self, text: str) -> str:
|
||
"""
|
||
将文字转换为语音
|
||
|
||
Args:
|
||
text: 要转换的文字
|
||
|
||
Returns:
|
||
Base64 编码的音频数据
|
||
"""
|
||
if not self.client:
|
||
# 如果没有配置 API Key,返回空字符串
|
||
return ""
|
||
|
||
try:
|
||
# 调用 OpenAI TTS API
|
||
response = self.client.audio.speech.create(
|
||
model="tts-1",
|
||
voice="alloy", # 可选: alloy, echo, fable, onyx, nova, shimmer
|
||
input=text
|
||
)
|
||
|
||
# 读取音频数据
|
||
audio_bytes = BytesIO()
|
||
for chunk in response.iter_bytes():
|
||
audio_bytes.write(chunk)
|
||
|
||
# 转换为 Base64
|
||
audio_data = audio_bytes.getvalue()
|
||
audio_base64 = base64.b64encode(audio_data).decode('utf-8')
|
||
return audio_base64
|
||
except Exception as e:
|
||
# 出错时返回空字符串
|
||
print(f"TTS 生成失败: {str(e)}")
|
||
return ""
|
||
|
||
|
||
# 全局实例
|
||
tts_service = TTSService() |