File size: 2,327 Bytes
3373b3e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import base64
import os
import streamlit as st
from openai import OpenAI


def get_mimo_tts_client():
    """获取 mimo TTS 客户端(复用同一套密钥)"""
    api_key = os.getenv("MIMO_API_KEY")
    base_url = os.getenv("MIMO_BASE_URL")

    if not api_key:
        try:
            api_key = st.secrets["MIMO_API_KEY"]
        except Exception:
            pass

    if not base_url:
        try:
            base_url = st.secrets["MIMO_BASE_URL"]
        except Exception:
            base_url = "https://api.xiaomimimo.com/v1"

    if not api_key:
        return None

    return OpenAI(api_key=api_key, base_url=base_url)


# mimo-v2.5-tts 预置音色列表
PRESET_VOICES = {
    "冰糖": {"id": "冰糖", "lang": "中文", "gender": "女性"},
    "茉莉": {"id": "茉莉", "lang": "中文", "gender": "女性"},
    "苏打": {"id": "苏打", "lang": "中文", "gender": "男性"},
    "白桦": {"id": "白桦", "lang": "中文", "gender": "男性"},
    "Mia": {"id": "Mia", "lang": "英文", "gender": "女性"},
    "Chloe": {"id": "Chloe", "lang": "英文", "gender": "女性"},
    "Milo": {"id": "Milo", "lang": "英文", "gender": "男性"},
    "Dean": {"id": "Dean", "lang": "英文", "gender": "男性"},
}


def text_to_speech(
    text: str,
    voice: str = "冰糖",
    style: str = "",
) -> bytes:
    """调用 mimo-v2.5-tts 模型生成语音

    Args:
        text: 要合成的文本(放在 assistant 消息中)
        voice: 预置音色名称
        style: 风格指令(放在 user 消息中,可选)

    Returns:
        WAV 格式的音频字节数据
    """
    client = get_mimo_tts_client()
    if not client:
        raise RuntimeError("未配置 MIMO API Key")

    messages = []

    # user 消息:风格指令(可选)
    if style:
        messages.append({"role": "user", "content": style})
    else:
        messages.append({"role": "user", "content": ""})

    # assistant 消息:要合成的目标文本
    messages.append({"role": "assistant", "content": text})

    completion = client.chat.completions.create(
        model="mimo-v2.5-tts",
        messages=messages,
        audio={"format": "wav", "voice": voice},
    )

    message = completion.choices[0].message
    audio_bytes = base64.b64decode(message.audio.data)
    return audio_bytes