跳至内容

Microsoft MAI 模型:使用 Streamlit 测试 MAI-Transcribe-1、MAI-Voice-1 和 MAI-Image-2

构建一个可用的演示应用,通过 Azure 的语音转文本、文本转语音与图像生成调用三款 Microsoft MAI 模型,并了解它们的能力。
已更新 2026年10月6日  · 14分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

微软发布了三款可用于生产的模型,统称 MAI(Microsoft AI),包括用于语音转文本的MAI-Transcribe-1、用于文本转语音的MAI-Voice-1,以及用于文生图的MAI-Image-2。三者均可通过 Microsoft Foundry 获取,支持真实的 API 访问。

在本教程中,我们将做两件事:首先,逐步讲解如何通过 Azure 为每个模型开通与连接;然后,我们将构建一个 Streamlit 应用,使用真实的提示词与 API 调用来测试这三款模型。

完成本教程后,您将能够:

  • 在 Azure 上配置 MAI-Transcribe-1、MAI-Voice-1 和 MAI-Image-2
  • 理解关键基准测试以及它们的实际含义
  • 通过 Streamlit 界面用 Python 调用这三款模型
  • 在投入构建之前,了解每个模型的关键特性与局限

完整代码可在 GitHub 仓库中获取。

什么是 Microsoft MAI 模型?

微软的 MAI 模型家族由 Microsoft AI Superintelligence 团队打造。这些模型完全由微软内部研发,基于微软自有基础设施训练、为微软的服务栈优化,并通过 Azure 直接部署。MAI-Transcribe-1 和 MAI-Voice-1 运行在同一套已经为企业客户大规模服务的 Azure Speech 基础设施上;而 MAI-Image-2 采用与 Stable Diffusion 3 相同训练目标的 flow-matching diffusion 架构,非嵌入参数规模在 100 亿至 500 亿之间。

以下是三者的快速概览:

模型

任务

关键指标

价格

MAI-Transcribe-1

语音转文本

FLEURS 上平均 WER 3.88%

$0.36/小时

MAI-Voice-1

文本转语音

1 秒生成 60 秒音频

$22/100 万字符

MAI-Image-2

文本转图像

总体 Elo 1190

$5/100 万文本 tokens + $33/100 万图像 tokens

在开始构建之前,让我们逐一深入了解。

MAI-Transcribe-1

MAI-Transcribe-1 是支持 25 种语言的语音转文本模型。其核心指标是在 FLEURS 基准上的平均词错误率(WER)为 3.88%(越低越好),领先于 GPT-Transcribe(4.17%)、Scribe v2(4.32%)、Gemini 3.1 Flash-Lite(4.89%)和 Whisper-large-v3(7.60%)。

该模型专为嘈杂现实环境音频而构建,适应噪声场景、混合口音和自然说话风格。微软还称,MAI-Transcribe-1 在保持良好准确率的同时,其 GPU 成本约为领先替代方案的 50%,这对大规模转写的企业尤具意义。

不过,它仍不支持实时转写、说话人分离和上下文偏置,这些功能均标注为“即将推出”。

MAI-Voice-1

MAI-Voice-1 是微软的高保真 TTS 模型。其关键能力是语音提示:您提供 10 秒的音频样本,模型即可在无需微调的情况下克隆该声音。不过,语音克隆需要通过微软的门控审批,但经过筛选的声音库(如 en-us-Jasper:MAI-Voice-1、en-us-June:MAI-Voice-1 等)可立即使用。

该模型能在单块 GPU 上用 1 秒时间生成 60 秒音频,支持通过 SSML 进行逐轮情感控制,并面向有声书、播客等长内容而设计。它已经为微软自家产品中的 Copilot Audio Expressions 和播客功能提供支持。

该模型的一个不足在于目前“仅支持英语”,其他 10 多种语言即将推出。

MAI-Image-2

MAI-Image-2 采用 flow-matching diffusion 架构,参数规模为 100–500 亿。它在 Arena.ai 的图像榜单中位列前三,且在生产中比 MAI-Image-1 快两倍。该模型与摄影师、设计师和视觉叙事者协作开发,已部署于 Copilot、Bing Image Creator 和 PowerPoint 中,特别侧重于照片级真实感、准确的肤色以及清晰可辨的图中字幕。

其按类别的 Elo 分数包括真实照片(1201)和人像(1201),表现尤为突出;而文本渲染(1186)虽然较先前提升,但仍是相对薄弱的类别。

为三款模型配置 Azure

三款 MAI 模型均可在 Microsoft Azure 上获取。MAI-Transcribe-1 和 MAI-Voice-1 共用同一Azure Speech 资源,而 MAI-Image-2 通过Microsoft Foundry 运行。我们分别进行设置。

先决条件

  • 注册或登录 Azure 账户可获得 $200 免费额度
  • Python 3.9+

步骤 1:创建 Azure Speech 资源

MAI-Transcribe-1 与 MAI-Voice-1 通过 Azure AI Speech 服务访问,因此一个资源即可覆盖两者。

  • 访问 portal.azure.com

  • 在搜索栏中输入 Speech 并选择 Speech services

  • 点击 + Create

  • 填写表单:

    • 资源组:创建新资源组并命名为 mai-demo-rg

    • 区域: 选择 East US,因为 MAI 模型当前仅支持 East US 和 West US

    • 名称: mai-speech-demo

    • 定价层: Standard S0

    • 注意: 免费的 F0 有速率限制,可能影响演示

  • 最后点击 Review and create,等待加载后点击 Create。

部署完成后,前往左侧边栏的 Keys and Endpoint,复制 Key 1 并记录 Region 值(eastus)。

创建 Azure Speech 资源

步骤 2:创建 Foundry 资源并部署 MAI-Image-2

MAI-Image-2 通过Microsoft Foundry 访问,与常规 Azure 门户分离。

Foundry

  • 在 Azure 门户首页,点击顶部服务行中的 Foundry

  • 点击 Create a resource

  • 然后填写如下信息:

    • 资源组:选择步骤 1 中的同一 mai-demo-rg

    • 区域:East US

    • 名称:mai-image-demo

    • 默认项目名称: proj-default

  • 随后点击 Review and create,然后点击 Create

  • 资源创建完成后,点击 Go to Foundry portal。

  • 接着在 Foundry 界面,点击左侧边栏的 Model catalog

模型目录

  • 在搜索栏中搜索 MAI,您将看到四款 MAI 模型的列表

MAI 模型

  • 选择 MAI-Image-2 并点击 Use this model

  • 在部署对话框中设置:

    • 部署名称:MAI-Image-2

    • 部署类型:Global Standard

  • 最后点击deploy

MAI-Image-2

部署完成后,您将进入部署详情页。复制 Target URI(类似 https://mai-image-demo.services.ai.azure.com/models)和 Key。

步骤 3:配置 .env 文件

在本地项目目录中创建 .env 文件,并加入前两步获取的内容:

AZURE_SPEECH_KEY=your_speech_key_1_here
AZURE_SPEECH_REGION=eastus
AZURE_IMAGE_ENDPOINT=https://your-resource-name.services.ai.azure.com/models
AZURE_IMAGE_KEY=your_foundry_key_here
AZURE_IMAGE_DEPLOYMENT=MAI-Image-2

重要提示:AZURE_IMAGE_DEPLOYMENT 区分大小写。请与 Foundry 中显示的 MAI-Image-2 完全一致,使用小写 mai-image-2 将返回 unknown_model 错误。

MAI 模型演示:用 Streamlit 构建语音、声音与图像应用

本节我们将构建一个包含三个标签页的 Streamlit 应用,通过实时 Azure API 调用三款 MAI 模型。应用的高层逻辑如下:

  • 标签页 1:接收 WAV、MP3 或任意音频文件,通过 Azure Speech REST API 调用 MAI-Transcribe-1,返回完整转写结果及延迟与成本指标
  • 标签页 2:接收文本输入、声音与情感风格选择,构建 SSML 请求,调用 MAI-Voice-1 返回可播放的 MP3 音频文件
  • 标签页 3:接收文本提示与分辨率设置,通过 Azure Foundry 端点调用 MAI-Image-2,并内联渲染生成的图像,支持下载
  • 应用会在您配置输入时,实时显示各模型的成本预估

文件结构如下:

mai_demo/
├── app.py            # Streamlit UI 
├── mai_clients.py    # Azure API wrappers 
├── requirements.txt
└── .env

应用分为两个文件:mai_clients.py 负责所有 Azure API 调用并返回结构化结果字典,app.py 负责 Streamlit 界面。让我们按步骤构建。

步骤 1:安装依赖

不同于本地模型设置,本应用连接实时 Azure 云 API,因此依赖列表既包含 Azure Speech SDK,也包含 HTTP 与图像处理库。

pip install -r requirements.txt

requirements.txt 文件内容:

.txt
streamlit>=1.35.0
azure-cognitiveservices-speech>=1.38.0
requests>=2.31.0
pillow>=10.0.0
python-dotenv>=1.0.0
openai>=1.30.0

本项目将使用:

  • streamlit 用于三标签页 UI、文件上传、音频播放与内联图像渲染

  • azure-cognitiveservices-speech 提供 Azure Speech SDK,用于与 MAI-Transcribe-1 和 MAI-Voice-1 通信

  • requests 向三个 Azure 端点发起直接 REST API 调用

  • pillow 解码并显示 MAI-Image-2 返回的图像字节

  • python-dotenv 在运行时从 .env 文件加载 Azure 密钥与端点 URL

  • openai 用作兼容 Azure OpenAI 的 SDK,支持 Foundry 图像生成端点

安装完成后,请确保 .env 文件与 app.py 位于同一目录。所有凭据会在启动时通过 python-dotenv 自动加载。

步骤 2:构建 API 客户端层(mai_clients.py)

所有 Azure API 调用均在 mai_clients. py ' 中实现,每个函数返回一个简洁的 {"success": bool, ...}` 字典,以避免 UI 层在出错时崩溃。

MAI-Transcribe-1:语音转文本

MAI-Transcribe-1 通过 Azure Speech REST API 的 LLM Speech 端点访问。关键点在于它接收 multipart 表单请求,包含音频文件与一个 JSON 定义对象。

def transcribe_audio(audio_bytes: bytes, filename: str = "audio.wav") -> dict:
    url = (
        f"https://{speech_region}.api.cognitive.microsoft.com"
        f"/speechtotext/transcriptions:transcribe?api-version=2024-11-15"
    )
    headers = {"Ocp-Apim-Subscription-Key": speech_key}
    definition = '{"locales":["en-US"],"profanityFilterMode":"None"}'
    files = {
        "audio": (filename, audio_bytes, _mime_type(filename)),
        "definition": (None, definition, "application/json"),
    }
    resp = requests.post(url, headers=headers, files=files, timeout=60)
    data = resp.json()
    combined = " ".join(
        p.get("text", "") for p in data.get("combinedPhrases", [])
    ).strip()
    return {"success": True, "transcript": combined, "raw": data, ...}

上述代码返回的响应是一个包含 combinedPhrases 的 JSON 对象,该字段为文本片段数组。我们将其拼接为单一的转写字符串。支持的音频格式包括 WAV、MP3 和 FLAC。该 API 目前仅限 East US 与 West US 区域。

MAI-Voice-1:文本转语音

MAI-Voice-1 使用标准的 Azure Speech TTS(通过 SSML)。关键在于构造 <mstts:express-as> 块以控制情感,并引用正确的发音人名称格式(en-us-Jasper:MAI-Voice-1)。

def _build_ssml(text: str, emotion: str, voice_name: str) -> str:
    style_map = {
        "neutral": None,
        "joy": "joy",
        "excitement": "excitement",
        "empathy": "empathy",
    }
    style = style_map.get(emotion)
    text_block = (
        text if style is None
        else f"<mstts:express-as style='{style}'>{text}</mstts:express-as>"
    )
    return f"""<speak version='1.0' xml:lang='en-US'
        xmlns='http://www.w3.org/2001/10/synthesis'
        xmlns:mstts='http://www.w3.org/2001/mstts'>
      <voice name='{voice_name}'>
        {text_block}
      </voice>
    </speak>"""

MAI-Voice-1 可用的发音人名称遵循 en-us-{Name}:MAI-Voice-1 格式。目前包含 Jasper、June、Grant、Iris、Reed 和 Joy。

MAI-Image-2:文本转图像

MAI-Image-2 使用 Foundry 专用端点,而不是标准的 Azure OpenAI /openai/deployments/ 路径。正确的端点格式为:

url = f"{base_endpoint}/mai/v1/images/generations"

这里 base_endpoint 是 Foundry 资源 URL 的根(例如 https://your-resource.services.ai.azure.com),构造请求前需要去掉末尾的 /models。请求体有两点要求:首先,必须显式传入 model 字段并设置为部署名称,这与标准 OpenAI 端点不同(后者通常从 URL 路径推断模型):

payload = { "model": deployment, # "MAI-Image-2" "prompt": prompt, "width": width, "height": height, }

其次,图像尺寸有硬性约束:width 与 height 至少为 768 像素,且两者乘积不得超过 1,048,576;对于正方形图像,最大为 1024×1024。传入 512×512 或省略尺寸将返回 400 Bad Request。

响应遵循标准的 OpenAI 图像生成结构。data 数组中的每一项包含一个指向已托管图像的 url,或包含原始 base64 编码字节的 b64_json 字段。客户端需同时兼容两种返回:

image_url = row.get("url")
b64 = row.get("b64_json")
if b64:
    img_bytes = base64.b64decode(b64)
elif image_url:
    img_resp = requests.get(image_url, timeout=30)
    img_bytes = img_resp.content

注意:url 响应具有时效性,因此需要立即拉取并缓存字节数据,而不是仅保存 URL 供后续使用。

步骤 3:构建 Streamlit 界面(app.py)

应用按模型划分为三个标签页。结构如下:

import streamlit as st
from mai_clients import transcribe_audio, synthesize_speech, generate_image
tab1, tab2, tab3 = st.tabs([
    "🎙 MAI-Transcribe-1",
    "🔊 MAI-Voice-1",
    "🖼 MAI-Image-2",
])

每个标签页遵循相同模式:输入 → 按钮 → 加载动画 → 结果展示 → 成本指标。

标签页 1:MAI-Transcribe-1

第一个标签页用于音频上传与转写。它接受 WAV、MP3 和 FLAC 文件,支持内联播放以便核对测试内容,并在点击按钮后将字节直接传给 transcribe_audio()。

with tab1:
    audio_file = st.file_uploader("Upload audio file", type=["wav", "mp3", "flac"])
    if audio_file:
        st.audio(audio_file)
        if st.button("Transcribe", type="primary"):
            with st.spinner("Calling MAI-Transcribe-1..."):
                result = transcribe_audio(audio_file.read(), audio_file.name)
            if result["success"]:
                st.text_area("Transcript", value=result["transcript"], height=140)
                m1, m2, m3 = st.columns(3)
                m1.metric("Latency", f"{result['latency_s']}s")
                m2.metric("Audio duration", f"{result['duration_ms']/1000:.1f}s")
                m3.metric("Est. cost", f"${result['duration_ms']/3_600_000 * 0.36:.5f}")

调用成功后,转写文本将显示在可编辑文本区域,随后展示三项指标:API 延迟(秒)、从响应的 durationMilliseconds 字段提取的音频时长,以及按 duration_in_hours × $0.36 计算的预估成本。

一个 7 秒音频的成本约为 $0.0000007,足以让您多次测试而几乎不消耗 Azure 额度。

标签页 2:MAI-Voice-1

第二个标签页负责文本转语音合成。它提供三项最关键的测试控件:文本输入、情感风格与发音人选择,这些都会直接传入 synthesize_speech() 函数。

with tab2:
    text_input = st.text_area("Text to synthesize", value="The quarterly results exceeded...")
    emotion = st.selectbox("Emotion / style", ["neutral", "joy", "excitement", "empathy"])
    voice_name = st.selectbox("Voice", ["en-us-Jasper:MAI-Voice-1", "en-us-June:MAI-Voice-1", ...])
    if st.button("Synthesize", type="primary"):
        with st.spinner("Calling MAI-Voice-1..."):
            result = synthesize_speech(text_input, emotion=emotion, voice_name=voice_name)
        if result["success"]:
            st.audio(result["audio_bytes"], format="audio/mp3")

情感选择器在底层映射为 SSML 的 <mstts:express-as> 样式;neutral 将完全省略该标签以获得干净的基线输出,而 joy、excitement 与 empathy 会呈现明显差异的语速与音高曲线。发音人下拉框覆盖当前的六种 MAI-Voice-1 声音:Jasper、June、Grant、Iris、Reed 和 Joy。

成功后,返回的 MP3 字节会直接传给 st.audio() 内联播放。以 113 个字符为例,预估成本约 $0.000002,足以多次测试而不明显消耗额度。

标签页 3:MAI-Image-2

第三个标签页用于文本转图像。MAI-Image-2 当前 API 暴露两个输入参数:提示词与分辨率。没有质量档位或风格控制,模型会在内部处理。

with tab3:
    prompt = st.text_area("Image prompt", value="A worn paperback book on a café table...")
    size = st.selectbox("Resolution", ["1024x1024", "1365x768", "768x1365"])
    if st.button("Generate", type="primary"):
        with st.spinner("Calling MAI-Image-2..."):
            result = generate_image(prompt, size=size)
        if result["success"]:
            img = Image.open(io.BytesIO(result["image_bytes"]))
            st.image(img, use_container_width=True)

这三种分辨率覆盖主要纵横比:正方形(1024×1024)、横向(1365×768)与纵向(768×1365)。大小字符串会被解析为宽高整数再传给 API,因为 Foundry 端点要求分别提供宽与高字段,而非合并字符串。

成功后,将 API 响应中的原始图像字节包装为 BytesIO 缓冲区,用 Pillow 打开,并以容器全宽内联渲染。图像生成通常需 2–4 秒,显著快于同环境下的 MAI-Image-1。

步骤 4:运行应用

配置好 .env 且安装依赖后,即可运行应用。

streamlit run app.py

Streamlit 将启动本地服务器并自动在浏览器打开应用,地址为 http://localhost:8501。您应能看到三个标签页的界面,默认激活 MAI-Transcribe-1。

最终演示

测试这些模型

以下为我们实际运行模型时的产出。

测试 1:嘈杂音频转写

我用一段 7 秒音频测试了 MAI-Transcribe-1,录制环境为有意制造的噪声场景,口音为印度口音。模型在 2 秒内返回了干净且准确的转写。

结论:在带口音的语音上表现稳健,而这恰是 Whisper-large-v3 往往最吃力的场景。不过,分语言的数据表现不同,例如阿拉伯语为 10.1%,丹麦语为 13.2%,均显著高于头部平均值。如果您的用例涉及特定语言或地区口音分布,请务必用真实音频进行测试,再决定是否在生产中采用该模型。

测试 2:情感控制

我使用 en-us-Jasper:MAI-Voice-1 发音人,以 excitement 风格合成了一句 113 个字符的句子,模型在 1 秒内返回了 6 秒的 MP3。输出中的情感明显更强,语速更有活力,音高变化更大。

MAI-Voice-1 的情感控制

结论:在 1 秒内生成 6 秒音频相当亮眼。SSML 情感控制有效,但仅限四种风格:neutral、joy、excitement 和 empathy。因此不要指望能达到 ElevenLabs 风格库那样的丰富表达。

测试 3:照片级真实感与文本渲染

这是最有意思的测试,因为我有意选择了一个同时包含两项挑战的提示词:照片级场景构图与图中可读文字。多数扩散模型至少会在其中一项上失手。

提示词: "A worn paperback book on a café table, natural window light, steam rising from an espresso cup beside it. The book cover reads: INFERENCE AT SCALE — text clearly legible, not warped."

MAI-Image-2 输出

结论:照片级真实感确实很强,自然的窗光、逼真的蒸汽,以及书本与咖啡杯的可信质感都表现出色。文本 "INFERENCE AT SCALE" 也被正确、清晰地渲染了出来。

不过,文本渲染在不同次生成间仍不稳定。在多次使用相似提示的测试中,模型偶尔会拼写错误或出现乱码。这是所有现有扩散模型的已知失效模式;MAI-Image-2 表现优于多数同类,但并非免疫。此外,当前最大分辨率为 1024×1024 像素,对于大多数 Web 与内容场景已足够,但若不经放大步骤,将无法直接用于印刷或大幅面创意输出。若您生成的图像中文本准确性至关重要,请务必增加人工审阅环节。

总结

微软的 MAI 模型家族整体表现出色,其中 MAI-Transcribe-1 在 FLEURS 上的指标最具可验证性:平均 WER 3.88% 截至撰文时属于同类最佳。

MAI-Voice-1 在速度与音质上令人印象深刻,但受限于仅支持英语与有限的情感样式。MAI-Image-2 能产出强烈的照片级真实感,但需注意文本幻觉仍会发生,上线时应配成人工审核。

本教程的完整代码已发布在 GitHub。


Aashi Dutt's photo
Author
Aashi Dutt
LinkedIn
Twitter

我是一名 Google Developers 机器学习(生成式 AI)领域的专家、Kaggle 三项专家,以及 Women Techmakers 大使,拥有 3 年以上的技术从业经验。2020 年我共同创办了一家健康科技初创公司,目前在佐治亚理工学院攻读计算机科学硕士,专攻机器学习。

FAQs

使用 MAI 模型需要付费 Azure 账户吗?

新的 Azure 账户可获 $200 免费额度,Azure for Students 账户包含 $100。鉴于三款模型完整演示会话的总成本远低于 $0.01,免费额度足以开始上手。若计划在生产中大规模使用,您需要升级为付费账户。

我能在语音代理中用 MAI-Transcribe-1 做实时转写吗?

暂不支持。MAI-Transcribe-1 仅支持批处理,您需提交完整音频文件并接收转写结果。若实时是硬性要求,请在等待期间保留 Whisper 或 Azure Speech 现有的实时方案作为后备。

为什么 MAI-Image-2 有时会把图像中的单词拼错?

这是扩散式图像生成模型的已知限制,并非 MAI-Image-2 独有。该模型通过将噪声逐步变为像素来生成图像,因此不像语言模型那样对拼写或字符序列有明确的理解。MAI-Image-2 的文本渲染较其前代显著提升(Elo 1186 vs 1069),但在不同次生成间仍会出现不一致,尤其是更长的单词或风格化字体。在用于生产前加入人工文本审核是个好选择。

我可以用 MAI-Voice-1 克隆任意声音吗?

通过 Personal Voice 功能进行语音克隆需要提供 10 秒的声音样本,并获得该声音所有者明确的录音同意。访问权限受限,您需要通过微软的 Limited Access Review 流程提交审批请求。

主题
人工智能

与 DataCamp 一起学习

学习路径

软件工程中的 AI

7 小时
使用最新的 AI 开发工具,包括 GitHub Copilot、Windsurf 和 Replit,更快地编写代码并构建软件应用程序。
查看详情Right Arrow
开始课程
查看更多Right Arrow