OFERRY正在进入矩阵

Mistral 放出 Voxtral 3:听、想、说压进一条实时管线,官方文档的语言数却对不上

10 月 20 日,Mistral 一次放出了一整条语音链路:转写、语音合成、加上一个把两者和推理模型串起来的语音代理 SDK。名字统称 Voxtral 3。

这件事值得单独写一篇的原因,在于 Mistral 对问题的拆法。官方开场先列了「一个可靠的语音代理必须同时做好四件事」:听得准(跨语言、跨口音、跨说话人、能处理打断)、想得深(在具体语境里理解用户意图)、说得自然(带情绪和表达)、能办事(跨连接的系统多步执行)。然后才说:把这四件事实时地同时做可靠,仍然很难。

这四点和大部分语音产品的宣传口径不太一样——多数团队只讲前三条。「能办事」被列为同等前置条件,也决定了 Voxtral 3 的交付物里必须有一个代理 SDK,而不只是两个模型。

一次给全的模型家族与价格#

先把官方的定价表原样搬过来,因为后面的成本账全靠它:

模型价格
Voxtral Mini Transcribe 3(批处理)$0.0035/min
Voxtral Mini Transcribe Realtime 3$0.008/min
Voxtral Small Transcribe 3$0.004/min
Voxtral Speech 3(批处理与实时同一套 API)$13/1M chars
语音代理 API(推理用 Mistral Small 4)$0.04/min
语音代理 API(推理用其它模型)$0.08/min

注意这里混了三种计费单位:转写按音频分钟,合成按字符,代理按分钟。这个细节会在预算环节咬人,后面单独算。

可用性上官方写的是「今天起通过 Mistral API 提供,托管在欧洲、美国与全球端点」,模型页标注为 Public Preview / Premier / v3.0;整套栈也支持自托管或私有云部署(官方给的入口是联系销售)。Studio 里可以直接试语音代理、音频转写、语音合成和声音克隆。

转写:FLEURS 上贴着第一梯队,实时档位给了取舍曲线#

官方口径的强项是四件事:多语言转写准确率、说话人分离(谁在什么时候说了什么)、上下文偏置(用关键短语提升专有名词召回)、以及原生支持的轮次结束预测——它同时结合声学与语义信息来判断用户说完了,用来降低「用户只是换气就被打断」的误切率。

支持语言数,官方写「扩展到 50 种,含 24 种欧盟官方语言**以及不少低资源亚洲与印度语系语言」,Mini 版本是 4B 参数,Small 版本在多语言转写与分离上超过 Whisper、Scribe v2 与 Gemini 3.5 Transcribe。

看数字要看图注。官方给了四张自测图,我按图注把它们归类清楚了:

① FLEURS 45 语言交集,强制指定语言 vs 自动检测。 横轴宏平均 WER(中日韩泰用 CER),七个系统两两成对出现,图上数字从 4.0% 到 16.0%;按图的系列顺序,垫底那组是 Whisper large-v3(16.0% / 14.9%),其余 12 个数字都落在 4.0%–6.3% 区间里。也就是说,第一梯队在这一档上挤得很紧,差距小于一个点。

② 说话人分离(cpWER,越低越好),官方在 AMI-IHM、AMI-SDM、Switchboard、Switchboard CallHome、AISHELL-4 五个公开基准上取宏平均:

系统cpWER
Voxtral Small Transcribe 318.4%
Voxtral Mini Transcribe 318.6%
Pyannote Orchestrator (Precision 3)19.0%
Microsoft AI Transcribe 220.3%
Scribe v223.0%
Voxtral Mini Transcribe 230.9%
Gemini 3.5 Transcribe38.4%

这一张的信息量比转写准确率那张大:分离任务上各家差距被拉开到 2 倍以上,上一代的 Voxtral Mini Transcribe 2 还在 30.9%,新一代直接进 18% 档——一代之间的进步幅度(12.5 个点)远大于同代竞品之间的差距。

③ 关键短语召回(Earnings 22,越高越好),柱状图用「外层=带上下文、内层=不带上下文」的叠加方式画:

  • Voxtral Small Transcribe 3:94.6%(带上下文)/ 81.4%(不带),提升 13.2 个点
  • Scribe v2:94.3% / 84.0%,提升 10.3 个点
  • Gemini 3.5 Transcribe:87.3% / 80.9%,提升 6.4 个点

上下文偏置在 Voxtral 上带来的增益是三者里最大的。 对做呼叫中心、医疗、法务这类专有名词密集场景的人来说,这个 13.2 个点意味着可以不微调就把术语召回顶上去。

④ 实时转写的延迟—准确率取舍,FLEURS 35 语言的宏平均 WER。这张图是最值得抄的一张,因为它把「可配置延迟」这个模糊说法变成了具体数字(按官方图的系列顺序读取):

系统 / 实时档位宏平均 WER
Voxtral Mini Transcribe 3(离线基线,非实时)4.0%
Gemini 3.5 Realtime Transcribe4.2%
Voxtral Mini Realtime 3 · 2400 ms5.7%
Microsoft AI Transcribe 2 Streaming5.8%
Voxtral Mini Realtime 3 · 960 ms6.0%
Voxtral Mini Realtime 3 · 480 ms6.4%
Voxtral Mini Realtime 3 · 240 ms7.4%
GPT Live Transcribe8.4%
Scribe v2 Realtime8.7%

读法:Mistral 自己的四个档位是干净单调的——把延迟预算从 2400 ms 收到 240 ms,WER 从 5.7% 爬到 7.4%,用 1.7 个点的准确率买 10 倍的响应速度。而它的 2400 ms 档已经贴着离线基线(5.7% 对 4.0%),这意味着「慢一点但更准」和「快一点但糊一点」在它这里是个连续可调旋钮,不是二选一。

这里要说明白:这四张图全是厂商自测,FLEURS 类基准与真实通话录音之间还有差距,接入前最好拿自己的音频跑一遍对照。

语音合成:三张「性价比」图,和一个必须点明的评测性质#

TTS 这边的宣传重心是「表达力 + 指令跟随」,官方口径是 35+ 语言、50+ 方言,并声称在成本上低于 OpenAI TTS-1、Deepgram、ElevenLabs Flash 与 Gemini Flash。

官方给了三张评测图,横轴是价格、纵轴是判分(都是「左上更好」的性价比图):

  1. 发音控制:300 条英文句子,每句含一个生僻或生造词(150 简单 / 150 困难),每个系统 2 个音色,评测方是 BeSimple AI 做的 Voice Code Bench;
  2. 多语言性价比:11 种语言各 1 个母语音色,377 条提示词取未加权均值;
  3. 英文表现力性价比:one_eval 237 条提示词,每系统 2 个音色(Voxtral 用的是 Sarah 和 James)。

三条图注里都写着同一句话:judge gemini-3.8-flash;prices from vendor pricing pages;generated 2026-10-20。 这三点决定了怎么读它:评委是竞品模型当判官(这点反而显得中立),价格取自各家自己的定价页,而评测本身仍然是 Mistral 内部评测(图注写作 Internal eval),不是第三方榜单。所以「SOTA」这个说法在这里的准确含义是「在厂商自测上」,别当成独立验证。

功能上,官方这次列的新东西有四样:从 30 分钟以上采样音频做声音克隆(Pro Voice 走的是同一路,官方措辞是「只用 30 分钟音频就能复现说话者的音色特征、情绪范围与说话风格,并跨语言保持」)、自定义提示词指令跟随、上下文感知 TTS(模型自己读语义来定情绪)、以及一个词表库。

显式指令跟随暴露了三个变量名:emotion、pacing、emphasis。模型页给的量化口径是 34 个情绪标签 + 2 个语速标签,另有 5 种输出格式与约 90 ms 的模型时延。

最难替代的其实是音素提示。 官方给了三个能直接对照的例子:英文的「Let’s end the debate here: it’s GIF」在不给提示时会读错,加上非标准音素提示 dʒ ɪ f 才读对;法语的 Reims 要提示成 ʁ e i m s,意大利语的人名 Quivello 要提示 tʃ i v ɛ l l o。专有名词、品牌名、外语地名这些「转写对了但合成读错」的坑,这是官方给出的解法,而且它是提示级的,不用重新训练。

语音代理 SDK:三阶段一条管线,换来的是「可换件」#

代理这块官方的架构描述可以直接画成一条流水线:Voxtral Mini Transcribe Realtime 3 负责听并判断轮次结束 → 通用模型(官方举例 Mistral Small 4)负责推理和调工具 → Voxtral Speech 3 按对话到目前为止的语气回话。三个关键承诺:没有任何一级等上一级(所以每轮在 1 秒内完成)、用户插话时代理立刻停嘴、以及每一级都是独立模型,所以换 LLM、换音色、换语言都不需要重写代理。

SDK 建在 LiveKit 上。会话通道上,代理接受和发起呼叫走 SIP,浏览器和应用里走 WebRTC,并能接进已有的电话系统、IVR 和联络中心软件。通话中可以用函数调用、联网搜索和对自有系统的检索来做身份核验、查账单、约时间这类事。官方给的 demo 脚本很能说明意图:一个法语转诊信的场景——代理先用工具查出转诊内容,把法语原文念给用户听,再翻译成英文解释,确认时间后调 book_appointment 落单,最后用英文把细节发短信给用户。

部署形态是它的差异点:整套栈可以跑在 Mistral 的欧洲托管 API 上,也可以自托管在自有基础设施里,官方在开头就把它归到「sovereign deployment」这条线上,卖点是「控制音频在哪里处理、数据怎么处理、通话是否留存」。对欧洲的医疗、政务类客户,这个选项往往比模型分数更关键。

上手:转写、实时、合成三份可跑代码#

① 批处理转写(curl,直接跑):

SHELL
export MISTRAL_API_KEY="你的 key"

curl https://api.mistral.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $MISTRAL_API_KEY" \
  -F model=voxtral-mini-transcribe-3 \
  -F file=@customer_call.wav \
  -F timestamp_granularities=segment
READ / EXECUTE / UNDERSTANDUTF-8

② Python(带说话人分离与上下文偏置):

PYTHON
import os
from mistralai.client import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

with open("customer_call.wav", "rb") as f:
    resp = client.audio.transcriptions.complete(
        model="voxtral-small-transcribe-3",          # 要最高准确率用 Small
        file={"file_name": "customer_call.wav", "content": f},
        diarize=True,                                # 谁在什么时候说话
        timestamp_granularities=["segment"],         # 注意:word 级不是所有模型都支持
        context_bias=["Voxtral", "deepseek-recipe", "xcljxf"],  # 领域词表,最多 100 条
    )

for seg in resp.segments:
    print(f"[{seg.start:.2f}-{seg.end:.2f}] speaker={seg.speaker}: {seg.text}")
READ / EXECUTE / UNDERSTANDUTF-8

③ 实时流式转写(WebSocket,同一会话里拿到增量文本):

PYTHON
# pip install "mistralai[realtime]"
from mistralai.client import Mistral
from mistralai.extra.realtime import AudioFormat, RealtimeTranscriptionEvent

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

with open("live_call.pcm", "rb") as audio_stream:
    for event in client.audio.realtime.transcribe_stream(
        audio_stream=audio_stream,
        model="voxtral-mini-transcribe-realtime-3",
        audio_format=AudioFormat(encoding="pcm_s16le", sample_rate=16000),
    ):
        if event.type == "transcription.text.delta":
            print(event.data.text, end="", flush=True)
        elif event.type == "transcription.done":
            print(f"\n本次音频时长:{event.data.usage.prompt_audio_seconds}s")
READ / EXECUTE / UNDERSTANDUTF-8

服务端的地址是 wss://api.mistral.ai/v1/audio/transcriptions/realtime?model=...。实时接口与说话人分离不兼容——要分离就得走批处理。延迟档位由参数从 80 ms 到 2400 ms 连续可配,上一节的 WER 表就是这套档位的实测代价。

④ 语音合成(curl):

SHELL
curl https://api.mistral.ai/v1/audio/speech \
  -H "Authorization: Bearer $MISTRAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "voxtral-mini-tts-3",
    "input": "Let us end the debate here. It is GIF.",
    "voice_id": "<音色 id,或用 ref_audio 做零样本克隆>",
    "response_format": "pcm"
  }' --output reply.pcm
READ / EXECUTE / UNDERSTANDUTF-8

文档在文本侧给了几条硬约束,都是上线前会踩的:输入文本必须用目标语言书写(用法语音色读英文文本会得到带法语口音的英文);数字与符号要写成可朗读形式;输入里不要放 markdown、表情符号或特殊字符;缩略语要拆成 F-B-I 或 F.B.I.;单次调用控制在 300 词以内;命内容审核会返回 403。流式场景推荐 pcm(首音频最快),要文件就用 mp3、wav、flac、opus。

三种计费单位怎么对齐:一段可跑的换算#

前面那张价格表混了三种单位,而真实业务是按「通话时长」结算的——所以必须自己把它换算成同一口径。下面这段脚本不做任何假设之外的事,代码里每个常量都标了来源:

PYTHON
# voxtral_cost.py —— 把官方三种计费单位换算成「每分钟」口径
STT_SMALL_PER_MIN   = 0.0040   # 官方表:Voxtral Small Transcribe 3
STT_MINI_PER_MIN    = 0.0035   # 官方表:Voxtral Mini Transcribe 3(批处理)
TTS_PER_MCHAR       = 13.0     # 官方表:Voxtral Speech 3,美元 / 百万字符
AGENT_SMALL4_PER_MIN = 0.040   # 官方表:代理 API + Mistral Small 4 推理
AGENT_OTHER_PER_MIN  = 0.080   # 官方表:代理 API + 其它推理模型


def chars_per_minute(words_per_minute: int, chars_per_word: float) -> float:
    """按语速与平均词长估计每分钟『字符』数。英文经验值 150 wpm、约 5.8 字符/词。"""
    return words_per_minute * chars_per_word


def tts_cost_per_minute(wpm: int = 150, chars_per_word: float = 5.8) -> float:
    cpm = chars_per_minute(wpm, chars_per_word)
    return cpm / 1_000_000 * TTS_PER_MCHAR


def agent_call_cost(minutes: float, reasoning="mistral-small-4") -> dict:
    rate = AGENT_SMALL4_PER_MIN if reasoning == "mistral-small-4" else AGENT_OTHER_PER_MIN
    stt = minutes * 0.008       # 代理里的「听」走 Realtime 档,$0.008/min
    tts_chars = minutes * chars_per_minute(150, 5.8)   # 代理里 TTS 也按字符计
    tts = tts_chars / 1_000_000 * TTS_PER_MCHAR
    return {
        "min": minutes,
        "stt_realtime": round(stt, 4),
        "tts_by_chars": round(tts, 4),
        "reasoning": round(minutes * rate, 4),
        "total_usd": round(stt + tts + minutes * rate, 4),
    }


if __name__ == "__main__":
    print(f"TTS 折合每分钟(英文 150 wpm):${tts_cost_per_minute():.4f}")

    # 中文按「一个汉字 = 一个字符」估:按每分钟 240 字朗读速度
    cn = 240 / 1_000_000 * TTS_PER_MCHAR
    print(f"TTS 折合每分钟(中文 240 字/分):${cn:.4f}")

    for m in (1, 10):
        row = agent_call_cost(m)
        print(f"代理通话 {m} 分钟:STT ${row['stt_realtime']} + TTS ${row['tts_by_chars']}"
              f" + 推理 ${row['reasoning']} = ${row['total_usd']}")
READ / EXECUTE / UNDERSTANDUTF-8

跑出来的结论很直观:TTS 折合每分钟约 0.0113 美元(英文按 150 wpm 计)或约 0.0031 美元(中文按 240 字/分计),也就是说合成比转写贵,而且贵在字符密度上——同样是「一分钟音频」,英文要念的字符数远多于中文。一个 10 分钟的英文代理通话,按官方价把三个环节加起来约 0.59 美元(转写 0.08 + 合成 0.1131 + 推理 0.40)。代理 API 的 0.04/min 推理费是成本主项,模型选择比音色选择更影响预算。

官方文档自己的两处矛盾(接入前先核)#

这套东西功能很齐,但我在核数字时撞到了两处官方自己口径不一的地方,都值得写进接入清单:

矛盾一:同一个 TTS 模型,支持语言数有三个版本。

  • 官方博客模型卡片:Voxtral Speech 3「跨 35+ 语言与 50+ 方言」,正文同样写 35+ / 50+;
  • 官方模型页(voxtral-mini-tts-3-0):Supports 9 languages,并且明确列出这 9 种:英、法、西、葡、意、荷、德、印地、阿拉伯;
  • 官方博客另一段:Voice Presets「提供 18 种语言」,并逐一列了阿拉伯语(阿联酋、现代标准)、巴西葡语、加泰罗尼亚语、中文(普通话)、荷兰语、英式与美式英语、法语、德语、希腊语、印地语、意大利语、韩语、挪威语、俄语、西班牙语(西班牙)、越南语。

这三个数字不是同口径的:9 是文档明确承诺并列出的语言;18 是预设音色库覆盖的语言;35+/50+ 是多语言评测覆盖面。合理做法是把 9(文档口径)当能力底线、18 当音色库上限,然后拿自己的目标语言去 Studio 试音。别拿 35+ 去写需求文档——那是评测覆盖面,不是可用清单。

矛盾二:TTS 的模型名与 id 有四种写法。 官方博客正文叫它 Voxtral Mini TTS 3,模型卡片叫 Voxtral Speech 3,文档页标题是 Voxtral TTS 3,而 API 里的模型 id 是 voxtral-mini-tts-3-0(文档示例里还出现过不带 -0 的短名)。转写侧同样:模型页是 voxtral-small-transcribe-3-0,文档示例里写的是 voxtral-mini-transcribe-3。结论很简单:以 GET /v1/models 返回的 id 为准,文档示例里的名字随时可能少个后缀。

顺带两条文档内部的小冲突也一起记下:批处理页面写「timestamp_granularities 与 language 二者不能同给」,而实时页面写延迟档位下限是 80 ms,博客卡片只宣传「sub-500ms」——80 ms 是接口允许的最小值,sub-500ms 是营销口径,两者不冲突但含义不同。

坑位清单#

  1. 三种计费单位要先换算:转写按分钟、合成按字符、代理按分钟。按通话时长结算的业务,必须先把自己折算到同一口径。
  2. 代理 API 的推理费是主项:0.04/min(Mistral Small 4)vs 0.08/min(其它模型),差一倍,选对模型比压音色省钱。
  3. 实时与说话人分离不兼容:要 diarization 走批处理,实时只能拿增量文本。
  4. word 级时间戳不是所有模型都支持(Mini 上会报 400),要分段就用 segment;给 diarize 但不给 segment 时间戳会报 422。
  5. timestamp_granularities 与 language 不能同给(批处理页面的明确要求)。
  6. 上下文偏置最多 100 个词/短语,且官方说明该能力对英文做了优化,其它语言属实验性——非英文场景要自己验证召回率。
  7. 音频 + 上下文超过模型上下文长度会整体报错,不是截断音频,是直接失败(默认走完所有 chunk 才报)。
  8. TTS 输入必须与音色语言一致,否则得到带口音的朗读;单次 ≤300 词,含 markdown/emoji 会被拒。
  9. 自托管/私有云要联系销售,不是文档里能自助开的能力。
  10. 评测数字全是厂商自测(且生成日期是 10 月 20 日当天),FLEURS 与真实通话差距不小,上线前用自有音频跑 A/B。

总结#

把 Voxtral 3 拆完,我的判断是:这不是一次「模型分数又高了」的发布,而是 Mistral 把语音从「两个 API」补成了「一条可交付的链路」。

几个具体的可取之处:转写在说话人分离上把差距拉开了(cpWER 18.4% 对上一代 30.9%),实时档位给了连续的延迟—准确率旋钮(240 ms 到 2400 ms,WER 7.4% 到 5.7%),上下文偏置带来的关键短语召回提升是三家对比里最大的(13.2 个点),而音素提示解决了专有名词朗读这个老问题。代理侧最有价值的不是分数,是每一级可替换 + 可自托管——换 LLM、换音色、换语言不用重写代理,且可以整套搬进自己的机房。

要打折扣的地方也很明确:所有评测都是厂商内部自测 + 竞品模型当判官,TTS 的核心卖点(35+ 语言)在官方文档里只有 9 种语言是明确列出的,模型名在四处文档里写法不一。接入前把 GET /v1/models 拉一遍、把目标语言在 Studio 试听一轮,比读任何宣传数字都省事。

参考与致谢#

  • Mistral 官方发布博客:https://mistral.ai/news/voxtral-3
  • 模型页:voxtral-small-transcribe-3-0、voxtral-mini-transcribe-3-0、voxtral-mini-transcribe-realtime-3-0、voxtral-mini-tts-3-0(docs.mistral.ai/models)
  • 文档:批处理转写 /studio/audio/speech_to_text/offline_transcription、实时转写 /studio/audio/speech_to_text/realtime_transcription、语音合成 /studio/audio/text_to_speech/speech、音色 /studio/audio/text_to_speech/voices
  • 音频总览:https://docs.mistral.ai/studio/audio/overview

声明:本文为技术解读,不构成任何投资或采购建议。文中所有价格与基准数字均来自 Mistral 官方博客与文档(2026-10-20 发布口径),其中 benchmark 类数据为厂商自测,已在正文标注;两处官方口径冲突也已如实列出。

Mistral 放出 Voxtral 3:听、想、说压进一条实时管线,官方文档的语言数却对不上

https://www.oferry.com/posts/a485/
作者
摆渡
发布于
许可协议
CC BY-NC-SA 4.0

除另有声明外,本文采用上述许可协议。转载或改编请注明作者与原文地址,并遵守许可条款。