使用说明

MSTTS 语音服务

本服务把微软语音能力封装成一个可自托管的中转接口。普通用户可以用网页生成阅读、爱阅记配置;开发者可以直接调用 API 生成音频。

快速开始

根据使用场景选择入口。只想给阅读类软件添加语音时,不需要手写接口参数。

  1. 打开 /reader
  2. 选择目标软件:阅读或爱阅记。
  3. 选择生成模式:固定链接或自定义语音列表。
  4. 选择一个或多个语言、音色、输出格式,生成配置。
  5. 复制导入链接或 JSON,到对应软件里导入。
页面默认语言优先选择 zh-CN。可以同时选择多个语言生成同一份配置;默认不包含其它语言的多语言音色,也不展开方言。

阅读配置生成器

/reader 是给最终用户准备的图形页面,用来生成阅读和爱阅记可以使用的 TTS 配置。

两种生成模式

模式 适合场景 结果
固定链接 希望软件以后重新导入同一个链接时,自动按最新微软语音列表生成配置。 返回一个配置 URL,并提供一键导入链接。
自定义语音列表 只想挑选少量指定音色、指定风格,生成一份稳定配置。 返回配置 URL、一键导入链接和可复制的 JSON。

常用选项

选项 说明
目标软件 支持阅读和爱阅记。阅读配置可由软件内语速滑块控制语速;爱阅记没有同样的独立语速参数,所以生成器会写入固定语速。
语言 可多选。固定链接和自定义语音列表都会合并已选语言,默认选择 zh-CN
扩展语音范围 “多语言”会加入第二语言支持已选语言的音色;“中文方言”会展开晓晓方言等方言音色。未勾选时不会混入港式中文或繁中。
输出格式 生成器默认选择 audio-48khz-192kbitrate-mono-mp3,适合大多数阅读场景。
音频参数 固定音调和固定音量默认都是 0%;爱阅记固定语速默认也是 0%
配置名称 阅读名称由“阅读名称前缀 + 语音显示名”组成,前缀为空时只使用语音显示名;爱阅记配置名称写入 _TTSName,分组写入 ttsConfigGroup
HD 参数 只对 HD 音色生效。普通音色不会带入这些参数。
如果服务配置了访问 token,生成器页面也需要填写同一个 token,否则语言、音色和格式列表无法加载。
如果服务运行在 HTTPS 反向代理后,生成器会优先使用 ReaderConfig.PublicBaseUrl,其次使用代理传入的 X-Forwarded-ProtoX-Forwarded-Host 来生成爱阅记合成地址。
阅读在线朗读规则使用 url地址,{UrlOption} 格式;生成器会把正文写成 {{JSON.stringify(speakText)}},并保留语速表达式中的 + 等 JS 运算符,避免阅读在执行 {{...}} 时遇到 JSON 转义导致的 JS 错误。

文本转语音 API

/mstts 用于把文本或 SSML 合成为音频。服务会自动获取并缓存微软 token,token 失效时会自动刷新。

GET /mstts

适合简单测试。参数放在 query string。

POST /mstts

推荐正式调用。请求体使用 JSON。

POST /mstts/postform

表单方式调用,字段与 /mstts 一致。

最小 JSON 示例

{
  "text": "你好,欢迎使用微软语音服务。",
  "voice": "zh-CN-XiaoxiaoNeural",
  "format": "audio-24khz-48kbitrate-mono-mp3"
}

GET 示例

/mstts?text=你好&voice=zh-CN-XiaoxiaoNeural&format=audio-24khz-48kbitrate-mono-mp3

直接传 SSML

传入 ssml 后,服务会直接把这段 SSML 发给微软,不再自动拼接 voice、style、rate 等参数。

{
  "ssml": "<speak version=\"1.0\" xml:lang=\"zh-CN\" xmlns=\"http://www.w3.org/2001/10/synthesis\"><voice name=\"zh-CN-XiaoxiaoNeural\">你好</voice></speak>",
  "format": "audio-24khz-48kbitrate-mono-mp3"
}

常用参数

不传 ssml 时,服务会按这些字段自动拼接 SSML;传入 ssml 后只保留 format 作为输出格式。

字段 默认值 说明
text 要朗读的文本。和 ssml 至少传一个;同时传入时优先使用 ssml
ssml 完整 SSML。适合复杂停顿、多音色、多说话人、音素等高级场景;服务不会再自动拼接 voicestylerate 等字段。
voice zh-CN-XiaoxiaoNeural 微软音色名称。可通过 /mstts/getvoice 查询当前 region 返回的完整列表;HD 音色可以带 :DragonHDLatestNeural:DragonHDOmniLatestNeural 后缀。
format riff-48khz-16bit-mono-pcm 输出音频格式。推荐传微软原始格式值,如 audio-24khz-48kbitrate-mono-mp3;也可以传 /mstts/getformat 返回的数字 id
rate 0% 语速,写入 <prosody rate>。支持倍率 0.5-2、相对百分比(如 -20%+30%),枚举值为 x-slowslowmediumfastx-fast
pitch 0% 音调,写入 <prosody pitch>。支持绝对 Hz、相对 Hz 或 st、相对百分比;枚举值为 x-lowlowmediumhighx-high。微软建议变化范围在原音高的 0.5-1.5 倍内。
volume 音量,写入 <prosody volume>。支持绝对数值 0.0-100.0、相对数值、相对百分比;枚举值为 silentx-softsoftmediumloudx-loud
range 音调变化范围,写入 <prosody range>。取值形式与 pitch 一致。
contour 音调曲线,写入 <prosody contour>。格式为多个 (时间,目标),例如 (0%,+20Hz) (40%,-2st);时间通常用百分比,目标取值形式参考 pitch
effect 音频优化效果,写入 <voice effect>。支持 eq_careq_telecomhp8k;后者用于 8 kHz 电话窄带场景。
style general 风格,写入 <mstts:express-as style>。是否可用取决于音色,优先看 /mstts/getvoice 中对应音色的 StyleList
style_degree 1 风格强度,写入 styledegree。取值范围 0.01-2,默认 1,最小步进 0.01
role 角色,写入 <mstts:express-as role>。枚举值:GirlBoyYoungAdultFemaleYoungAdultMaleOlderAdultFemaleOlderAdultMaleSeniorFemaleSeniorMale
lang 语言或口音,写入 <lang xml:lang>。使用 BCP-47 locale,例如 en-USen-GBzh-CN;非多语言音色不支持该元素。
当前支持的 format
  • raw-8khz-8bit-mono-mulaw
  • riff-16khz-16kbps-mono-siren
  • audio-16khz-16kbps-mono-siren
  • audio-16khz-32kbitrate-mono-mp3
  • audio-16khz-128kbitrate-mono-mp3
  • audio-16khz-64kbitrate-mono-mp3
  • audio-24khz-48kbitrate-mono-mp3
  • audio-24khz-96kbitrate-mono-mp3
  • audio-24khz-160kbitrate-mono-mp3
  • raw-16khz-16bit-mono-truesilk
  • riff-16khz-16bit-mono-pcm
  • riff-8khz-16bit-mono-pcm
  • riff-24khz-16bit-mono-pcm
  • riff-8khz-8bit-mono-mulaw
  • raw-16khz-16bit-mono-pcm
  • raw-24khz-16bit-mono-pcm
  • raw-8khz-16bit-mono-pcm
  • ogg-16khz-16bit-mono-opus
  • ogg-24khz-16bit-mono-opus
  • raw-48khz-16bit-mono-pcm
  • riff-48khz-16bit-mono-pcm
  • audio-48khz-96kbitrate-mono-mp3
  • audio-48khz-192kbitrate-mono-mp3
  • ogg-48khz-16bit-mono-opus
  • webm-16khz-16bit-mono-opus
  • webm-24khz-16bit-mono-opus
  • raw-24khz-16bit-mono-truesilk
  • raw-8khz-8bit-mono-alaw
  • riff-8khz-8bit-mono-alaw
  • webm-24khz-16bit-24kbps-mono-opus
  • audio-16khz-16bit-32kbps-mono-opus
  • audio-24khz-16bit-48kbps-mono-opus
  • audio-24khz-16bit-24kbps-mono-opus
  • raw-22050hz-16bit-mono-pcm
  • riff-22050hz-16bit-mono-pcm
  • raw-44100hz-16bit-mono-pcm
  • riff-44100hz-16bit-mono-pcm
  • amr-wb-16000hz
官方常见 style

这些值不是每个音色都支持。实际可用风格以当前音色的 StyleList 为准。

  • advertisement_upbeat
  • affectionate
  • angry
  • assistant
  • calm
  • chat
  • cheerful
  • customerservice
  • depressed
  • disgruntled
  • documentary-narration
  • embarrassed
  • empathetic
  • envious
  • excited
  • fearful
  • friendly
  • gentle
  • hopeful
  • lyrical
  • narration-professional
  • narration-relaxed
  • newscast
  • newscast-casual
  • newscast-formal
  • poetry-reading
  • sad
  • serious
  • shouting
  • sports_commentary
  • sports_commentary_excited
  • whispering
  • terrified
  • unfriendly

HD 音色参数

HD 参数只会在 HD 音色上写入到 <voice parameters>。普通音色不会带入这些字段;微软官方说明中 HD 音色的 SSML 元素支持比普通音色少,prosody 类参数可能被微软忽略。

字段 适用范围 取值范围 默认参考
temperature DragonHD / DragonHDOmni DragonHD: 0.0-1.0;DragonHDOmni: 0.3-1.0 DragonHD 官方示例为 1.0;DragonHDOmni 为 0.7
top_p DragonHDOmni 0.3-1.0 0.7
top_k DragonHDOmni 1-50 22
cfg_scale DragonHDOmni 1.0-2.0 1.4
enhance_pronunciation DragonHD / DragonHDOmni truefalse false
{
  "text": "Hello, this is an HD voice.",
  "voice": "en-US-Ava:DragonHDOmniLatestNeural",
  "temperature": 0.7,
  "top_p": 0.7,
  "top_k": 22,
  "cfg_scale": 1.4,
  "format": "audio-48khz-192kbitrate-mono-mp3"
}
参数取值参考微软官方 Text to speech REST APISSML voice and soundHD voices 文档;具体音色能力仍以当前 region 的 /mstts/getvoice 返回为准。

音色与格式查询

GET /mstts/getvoice

返回微软当前 region 下的音色列表。微软返回什么内容,服务尽量原样透传。

GET /mstts/getformat

返回可用输出格式。每项包含数字 id 和微软原始格式 value

[
  {
    "id": 23,
    "value": "audio-48khz-192kbitrate-mono-mp3"
  }
]

Region 与 Token

服务会自动从微软接口获取 token 和 region。通常不需要手动调用 /mstts/gettoken,只有排查 region 或单独接入时才需要。

GET /mstts/gettoken

返回当前可用 token 与 region。默认遵循配置文件里的 region 选择模式。

参数 说明
regions 指定本次可接受的 region。支持逗号分隔,也支持重复传参;顺序表示优先级。
anyRegion=true 本次忽略默认 region 配置,拿到什么 region 就返回什么。
GET /mstts/gettoken
GET /mstts/gettoken?regions=southeastasia
GET /mstts/gettoken?regions=southeastasia&regions=eastus&regions=westeurope
GET /mstts/gettoken?anyRegion=true

默认 Region 与差异

默认首选 southeastasiaeastuswesteurope。这三个 region 是当前公共预览语音测试中覆盖最完整的返回区域,优先用于减少 HD、Preview 和 multi-talker 音色缺失。

同一个接口还能拿到 eastasianortheuropewestus 等 region;这些区域可以用于常规音色,但公共预览、HD、multi-talker 或新增音色的覆盖可能少于默认三项。具体音色不要写死,建议用 /mstts/getvoice 或管理后台的“获取可用 Region”按当前返回确认。

微软官方 Speech 文档说明:REST API 的 region 是 endpoint URI 的一部分,区域会影响服务端点、密钥和功能可用性;部分功能需要指定 region。这里的默认值来自公共 translator-token endpoint 的实测结果,不等同于 Azure Speech 官方全部可创建区域列表。
默认 Priority 模式会按 region 列表顺序选择。服务会在最大尝试次数内保留本轮拿到过的最高优先级 region;如果拿到第一优先级 region,会立即返回。失败响应会列出本轮尝试拿到的所有 region,方便判断微软当前返回情况。

管理后台

/admin 用账号密码登录,不使用 ApiAuth.Token。后台可以修改配置、刷新微软 token、查看 data 目录状态、统计和清理自定义配置快照。

配置页默认用有序列表管理 Region 优先级。点击“获取可用 Region”后,勾选会追加到列表末尾,取消勾选会从列表移除;点击已选 Region 可以展开上移、下移和移除操作。手动文本编辑保留在“自定义编辑”折叠项里。

首次登录

  1. 启动服务后打开 /admin
  2. 使用 /app/data/admin-initial-password.txt 里的临时密码登录。
  3. 首次登录后修改密码。
通过后台保存配置会立即重新加载运行时配置。手动编辑 /app/data/appsettings.json 后,建议重启服务。

部署与鉴权

配置文件位置

Docker 部署推荐挂载整个 /app/data 目录。首次启动时,如果 /app/data/appsettings.json 不存在,服务会自动创建一份默认配置。

docker run -d \
  --name mstts \
  -p 8080:8080 \
  -v /data/mstts:/app/data \
  hejd/mstts:latest

Docker Compose 示例:

services:
  mstts:
    image: hejd/mstts:latest
    container_name: mstts
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - "/data/mstts:/app/data"

常用配置

{
  "ApiAuth": {
    "Token": ""
  },
  "MicrosoftTranslatorToken": {
    "PreferredRegions": [
      "southeastasia",
      "eastus",
      "westeurope"
    ],
    "RegionSelectionMode": "Priority",
    "RegionMatchMaxAttempts": 30
  },
  "ReaderConfig": {
    "PublicBaseUrl": "",
    "SnapshotRetentionDays": 0,
    "ShareTokenSecret": ""
  },
  "Admin": {
    "Enabled": true,
    "Username": "admin",
    "PasswordHash": "",
    "ForcePasswordChange": true,
    "SessionDays": 7
  }
}
配置项 说明
ApiAuth.Token 字符串,留空表示不启用 /mstts/reader-config 的访问鉴权。填写后可通过 X-Api-Token 请求头、apiToken 查询参数或表单字段传入;后台保存时不允许包含空白字符。
PreferredRegions 字符串数组,默认 southeastasiaeastuswesteurope。顺序表示优先级;后台可以用有序列表调整,也保留换行、英文逗号或分号分隔的自定义文本编辑。
RegionSelectionMode 枚举:PriorityFirstMatchAutoPriority 按列表顺序优先选择,拿到第一项立即返回,否则在尝试结束后使用本轮拿到过的最高优先级 region;FirstMatch 拿到列表内任意 region 就立即返回;Auto 忽略默认列表,微软返回什么就用什么。
RegionMatchMaxAttempts 整数 1-200,默认 30。仅 PriorityFirstMatch 模式用于匹配首选 region;Auto 模式只请求一次。
ReaderConfig.PublicBaseUrl 可选的 http/https 绝对地址,例如 https://tts.example.com。用于反向代理、域名访问或固定导入链接场景;后台保存时会去掉结尾的 /
ReaderConfig.SnapshotRetentionDays 整数 0-3650,默认 0。自定义配置分享链接保留天数;0 表示长期保留,过期链接返回 404。
ReaderConfig.ShareTokenSecret 可选字符串,不允许包含空白字符。用于签名阅读配置导入链接里的受限令牌;留空时使用 ApiAuth.Token 作为签名密钥。
Admin.Enabled 布尔值,默认 true。设为 false 后后台登录和已有后台会话都会失效。
Admin.Username 管理后台账号,长度 3-64,不能包含空白字符。密码通过 /admin 修改,配置文件只保存哈希。
Admin.PasswordHash 后台密码哈希。首次启动为空时会自动生成临时密码并写入 /app/data/admin-initial-password.txt;不建议手动编辑。
Admin.ForcePasswordChange 布尔值。临时密码首次登录后为 true,用户修改密码后变为 false
Admin.SessionDays 整数 1-90,默认 7。管理后台登录保持天数。

启用鉴权后的调用方式

curl -H "X-Api-Token: your-token" \
  "http://localhost:8080/mstts/getvoice"
http://localhost:8080/mstts?text=测试&voice=zh-CN-XiaoxiaoNeural&apiToken=your-token
通过管理后台保存配置会立即生效。直接修改 /app/data/appsettings.json 后,建议重启容器。