mistral.rs 文本转语音实战:用 OpenAI 兼容接口驱动 Dia 模型生成对话语音 📅 发布时间:2026/9/17 3:30:30 👁 浏览次数: mistral.rs 文本转语音实战用 OpenAI 兼容接口驱动 Dia 模型生成对话语音【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs导读本文围绕 mistral.rs 仓库中 docs/src/content/docs/examples/server/dia.md 这一可运行 HTTP 服务端示例展开讲解如何在本机启动 mistral.rs 服务器并加载DiaText-to-Dialogue语音合成模型再通过 OpenAI 兼容的client.audio.speech.create()接口把文本合成为 WAV 音频文件。读完本文你将掌握Dia 对话脚本[S1]/[S2]说话人标记的书写方式、/v1/audio/speech端点的请求字段与响应格式限制、以及该端点在 mistral.rs 内部的流水线与采样参数实现原理可直接照抄示例跑通自己的 TTS 服务。一、示例文档概览一个可直接运行的 HTTP 语音合成脚本关联文档dia.md对应的源示例位于 examples/server/dia.py它演示了 mistral.rs HTTP 服务器对外暴露的OpenAI 兼容语音合成接口。整个脚本只有三十行左右核心调用链非常清晰from pathlib import Path from openai import OpenAI client OpenAI(api_keyfoobar, base_urlhttp://localhost:1234/v1/) # text_to_speak [S1] Dia is an open weights text to dialogue model. [S2] You get full control over scripts and voices. [S1] Wow. Amazing. (laughs) [S2] Try it now on Git hub or Hugging Face. text_to_speak [S1] mistral r s is a local LLM inference engine. [S2] You can run text and vision models, and also image generation and speech generation. [S1] There is agentic web search, tool calling, and a convenient Python API. [S2] Check it out on github. response client.audio.speech.create( modeldefault, voiceN/A, inputtext_to_speak, response_formatwav ) output_path Path(output.wav) output_path.write_bytes(response.read()) print(fWAV audio written to {output_path.resolve()})要点拆解base_urlhttp://localhost:1234/v1/指向本地 mistral.rs 服务器。1234 正是 CLI 服务器默认端口见 mistralrs-cli/src/args/server.rs 中default_port()的实现。api_keyfoobar本地服务不校验真实密钥任意占位字符串即可通过。modeldefault服务器只加载了一个语音模型客户端用default指代它服务端在处理请求时会做模型名校验见下文解析逻辑。voiceN/ADia 的“音色”通过文本里的说话人标记[S1]/[S2]控制而不是通过voice参数因此这里传入占位值。response_formatwav请求 WAV 输出。注意当前语音端点只支持wav与pcm两种格式传入mp3、opus等会被服务端拒绝这一点下文结合源码说明。返回值直接写入output.wav即得到 44.1 kHz 单声道mono的 16-bit PCM WAV 文件。二、启动服务器加载 Dia 语音模型示例默认假设服务器已在localhost:1234运行。在 mistralrs-cli/src/args/mod.rs 的ModelType枚举中语音合成对应Speech子命令其内部只包含model模型来源与device设备两组选项不支持 GGUF/GGML 格式直接加载 Hugging Face 上的模型仓库mistralrs_server --port 1234 speech --model-id nari-labs/Dia-1.6Bspeech子命令对应的模型类型在 mistralrs-cli/src/commands/serve.rs 中构造为ModelSelected::Speech并显式指定架构SpeechLoaderType::Dia。--port默认值即 1234若你显式指定其他端口请同步修改客户端base_url。首次加载会从 Hugging Face 下载 Dia-1.6B 权重及其所需的DACDescript Audio Codec音频编解码器权重SpeechModelBuilder见 mistralrs/src/speech_model.rs允许通过with_dac_model_id()指定 DAC 模型仓库不指定时使用模型默认路径。启动成功后客户端脚本即可运行控制台会打印WAV audio written to .../output.wav。三、服务端请求解析/v1/audio/speech端点3.1 路由注册语音合成端点POST /v1/audio/speech的处理器speech_generation定义在 mistralrs-server-core/src/speech_generation.rs并在 mistralrs-server-core/src/mistralrs_server_router_builder.rs 中注册到路由表。3.2 请求字段请求体类型SpeechGenerationRequest定义在 mistralrs-server-core/src/openai.rs共三个字段字段类型说明modelStringTTS 模型标识默认为default服务端会校验其与已加载模型一致inputString要合成语音的文本response_formatAudioResponseFormat期望的音频格式其中voice与instructions字段在当前实现中被显式忽略源码注释注明 “voiceandinstructionsare ignored.”这与示例中传入voiceN/A的行为一致——音色由文本中的说话人标记决定。3.3 响应格式的硬性限制AudioResponseFormat枚举mistralrs-server-core/src/openai.rs虽定义了mp3、opus、aac、flac、wav、pcm六种但speech_generation处理器在parse_request之后会立即校验if !matches!( response_format, AudioResponseFormat::Wav | AudioResponseFormat::Pcm ) { return SpeechGenerationResponder::ValidationError(...); // Only wav and pcm response formats are supported. }因此当前只有wav和pcm两种输出格式可用其余格式会返回invalid_response_format错误。3.4 响应编码与 MIME服务端收到Response::Speech { pcm, rate, channels }后见 mistralrs-server-core/src/speech_generation.rs 的match_responseswav调用speech_utils::write_pcm_as_wav把 PCM 采样写入内存中的 WAV 容器pcm把f32采样逐点转成s16le16-bit 小端字节流返回原始数据两种响应均携带Content-Type格式为audio/wav; rate44100; channels1或audio/pcm; codecs1; formats16le; rate44100; channels1MIME 生成逻辑见AudioResponseFormat::audio_content_type。四、底层生成原理DiaPipeline 流水线4.1 整体结构Dia 语音流水线实现在 mistralrs-core/src/speech_models/dia/mod.rs 的DiaPipeline中核心组成文本编码器encoder把输入文本编码为条件表示解码器decoder以自回归方式逐步生成音频 code 序列支持 KV 缓存DiaKvCache见 mistralrs-core/src/speech_models/dia/cache.rsDAC 解码器把生成的离散音频 code 还原为 PCM 波形mistralrs-core/src/speech_models/dia/dac.rs音频后处理响度归一化normalize_loudness见 mistralrs-core/src/speech_models/utils.rs。流水线常量定义在 mistralrs-core/src/speech_models/dia/mod.rsRATE 44100输出采样率 44.1 kHzCHANNELS 1单声道TOKENS_PER_SECOND 86约每 86 个音频 token 对应 1 秒音频用于进度日志统计。4.2 对话脚本与说话人标记prepare_text_prompt会把文本中的[S1]、[S2]分别替换为控制字符\x01、\x02后按字节编码并 padding 到配置的text_length。这就是示例文本为什么带[S1]/[S2]前缀的原因——Dia 是text-to-dialogue模型[S1]/[S2]用于切换说话人可理解为“角色/音色”文本中的(laughs)等情绪标注也会被模型理解并体现在语音中。4.3 生成采样参数与默认值SpeechGenerationConfigmistralrs-core/src/speech_models/mod.rs为 Dia 提供了可调采样参数默认值如下参数默认值作用max_tokensNone使用配置的audio_length最大生成 token 数cfg_scale3.0Classifier-Free GuidanceCFG引导强度temperature1.3采样温度top_p0.95核采样阈值top_k35仅从前 35 个候选 token 采样DiaPipeline::generate采用CFG 双分支条件分支输入真实文本无条件分支输入全零张量每步 logits 按cond cfg_scale * (cond - uncond)融合见decoder_step采样时还做了 EOS 保护除非 EOS 是最高概率项否则屏蔽并在检测到 EOS 后按 delay pattern 逐步收尾。4.4 延迟模式delay pattern与音频生成Dia 的多通道音频 code 通过延迟模式delay pattern交错生成DataConfig.delay_pattern定义了每个通道相对主通道的延迟步数。流水线在 mistralrs-core/src/speech_models/dia/audio.rs 中预计算延迟索引build_delay_indices/apply_audio_delay/revert_audio_delay生成结束后再还原对齐、裁剪掉末尾延迟填充将合法范围内的 code0..1023交给 DAC 解码最后做响度归一化输出 PCM。模型结构配置DiaConfig见 mistralrs-core/src/speech_models/dia/config.rs包含version、modelencoder/decoder 层数、隐藏维、GQA 头数、RoPE 时间尺度等与data文本/音频长度、padding/EOS/BOS 值、延迟模式等完整描述了一个 encoder-decoder GQA 注意力 RoPE 的语音 Transformer 结构。值得注意的是 mistralrs-core/src/speech_models/dia/mod.rs 中有一处 CUDA 特性说明Dia 在 cublaslt 后端下存在精度问题加载时会把CUBLASLT_CONTROLLER置为抑制状态这是本项目为该模型做的针对性适配。五、进阶Python SDK 直接调用免服务器如果不想起 HTTP 服务也可以直接用 mistral.rs 的 Python 绑定调用同一模型对应示例见 examples/python/dia.pyfrom mistralrs import Runner, Which, SpeechLoaderType from pathlib import Path import struct, wave text_to_speak [S1] mistral r s is a local LLM inference engine. [S2] ... runner Runner( whichWhich.Speech( model_idnari-labs/Dia-1.6B, archSpeechLoaderType.Dia, ), ) res runner.generate_audio(text_to_speak) pcm_data res.pcm # list of floats between -1.0 and 1.0 output_path Path(output.wav) pcm_ints [int(max(-32768, min(32767, int(sample * 32767)))) for sample in pcm_data] with wave.open(output_path, wb) as wf: wf.setnchannels(res.channels) # mono wf.setsampwidth(2) # 16-bit wf.setframerate(res.rate) # 44100 wf.writeframes(b.join(struct.pack(h, s) for s in pcm_ints)) print(fWAV audio written to {output_path.resolve()})两种方式对照HTTP 服务方式本文主体适合多客户端共享、需要与既有 OpenAI 生态工具如openaiPython 包集成的场景Python SDK 方式适合单机脚本直接合成generate_audio返回的pcm是[-1.0, 1.0]区间的浮点采样需要自行转 16-bit 并封装 WAV示例代码给出了完整的struct.pack(h, ...)写法。六、常见问题与注意事项输出格式报错response_format只能填wav或pcm其他格式返回Only wav and pcm response formats are supported.。端口不一致客户端base_url的端口必须与--port一致默认 1234。音色控制不要依赖voice参数改用文本中的[S1]/[S2]说话人标记切换角色情绪标注如(laughs)会参与语音表现。首次下载首次加载会下载 Dia-1.6B 与 DAC 权重需保持网络可达可用SpeechModelBuilder::with_dac_model_id或服务端相关选项替换 DAC 来源。采样参数默认cfg_scale3.0、temperature1.3、top_p0.95、top_k35是项目给出的推荐起点可通过SpeechGenerationConfig调整后重试以获得不同表现。七、进一步阅读服务端示例源码examples/server/dia.pyPython SDK 对照示例examples/python/dia.py端点处理器与响应编码mistralrs-server-core/src/speech_generation.rs请求/响应格式定义mistralrs-server-core/src/openai.rsDia 生成流水线mistralrs-core/src/speech_models/dia/mod.rs模型与数据配置结构mistralrs-core/src/speech_models/dia/config.rs采样参数默认值mistralrs-core/src/speech_models/mod.rs语音模型构建器DAC 模型指定、dtype、max_num_seqs 等mistralrs/src/speech_model.rs【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考