快速开始
根据使用场景选择入口。只想给阅读类软件添加语音时,不需要手写接口参数。
- 打开
/reader。 - 选择目标软件:阅读或爱阅记。
- 选择生成模式:固定链接或自定义语音列表。
- 选择一个或多个语言、音色、输出格式,生成配置。
- 复制导入链接或 JSON,到对应软件里导入。
zh-CN。可以同时选择多个语言生成同一份配置;默认不包含其它语言的多语言音色,也不展开方言。
阅读配置生成器
/reader 是给最终用户准备的图形页面,用来生成阅读和爱阅记可以使用的 TTS 配置。
两种生成模式
| 模式 | 适合场景 | 结果 |
|---|---|---|
| 固定链接 | 希望软件以后重新导入同一个链接时,自动按最新微软语音列表生成配置。 | 返回一个配置 URL,并提供一键导入链接。 |
| 自定义语音列表 | 只想挑选少量指定音色、指定风格,生成一份稳定配置。 | 返回配置 URL、一键导入链接和可复制的 JSON。 |
常用选项
| 选项 | 说明 |
|---|---|
| 目标软件 | 支持阅读和爱阅记。阅读配置可由软件内语速滑块控制语速;爱阅记没有同样的独立语速参数,所以生成器会写入固定语速。 |
| 语言 | 可多选。固定链接和自定义语音列表都会合并已选语言,默认选择 zh-CN。 |
| 扩展语音范围 | “多语言”会加入第二语言支持已选语言的音色;“中文方言”会展开晓晓方言等方言音色。未勾选时不会混入港式中文或繁中。 |
| 输出格式 | 生成器默认选择 audio-48khz-192kbitrate-mono-mp3,适合大多数阅读场景。 |
| 音频参数 | 固定音调和固定音量默认都是 0%;爱阅记固定语速默认也是 0%。 |
| 配置名称 | 阅读名称由“阅读名称前缀 + 语音显示名”组成,前缀为空时只使用语音显示名;爱阅记配置名称写入 _TTSName,分组写入 ttsConfigGroup。 |
| HD 参数 | 只对 HD 音色生效。普通音色不会带入这些参数。 |
ReaderConfig.PublicBaseUrl,其次使用代理传入的 X-Forwarded-Proto 和 X-Forwarded-Host 来生成爱阅记合成地址。
url 的 地址,{UrlOption} 格式;生成器会把正文写成 {{JSON.stringify(speakText)}},并保留语速表达式中的 + 等 JS 运算符,避免阅读在执行 {{...}} 时遇到 JSON 转义导致的 JS 错误。
文本转语音 API
/mstts 用于把文本或 SSML 合成为音频。服务会自动获取并缓存微软 token,token 失效时会自动刷新。
适合简单测试。参数放在 query string。
推荐正式调用。请求体使用 JSON。
表单方式调用,字段与 /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。适合复杂停顿、多音色、多说话人、音素等高级场景;服务不会再自动拼接 voice、style、rate 等字段。 |
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-slow、slow、medium、fast、x-fast。 |
pitch |
0% |
音调,写入 <prosody pitch>。支持绝对 Hz、相对 Hz 或 st、相对百分比;枚举值为 x-low、low、medium、high、x-high。微软建议变化范围在原音高的 0.5-1.5 倍内。 |
volume |
空 | 音量,写入 <prosody volume>。支持绝对数值 0.0-100.0、相对数值、相对百分比;枚举值为 silent、x-soft、soft、medium、loud、x-loud。 |
range |
空 | 音调变化范围,写入 <prosody range>。取值形式与 pitch 一致。 |
contour |
空 | 音调曲线,写入 <prosody contour>。格式为多个 (时间,目标),例如 (0%,+20Hz) (40%,-2st);时间通常用百分比,目标取值形式参考 pitch。 |
effect |
空 | 音频优化效果,写入 <voice effect>。支持 eq_car、eq_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>。枚举值:Girl、Boy、YoungAdultFemale、YoungAdultMale、OlderAdultFemale、OlderAdultMale、SeniorFemale、SeniorMale。 |
lang |
空 | 语言或口音,写入 <lang xml:lang>。使用 BCP-47 locale,例如 en-US、en-GB、zh-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 | true 或 false |
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"
}
/mstts/getvoice 返回为准。
音色与格式查询
返回微软当前 region 下的音色列表。微软返回什么内容,服务尽量原样透传。
返回可用输出格式。每项包含数字 id 和微软原始格式 value。
[
{
"id": 23,
"value": "audio-48khz-192kbitrate-mono-mp3"
}
]
Region 与 Token
服务会自动从微软接口获取 token 和 region。通常不需要手动调用 /mstts/gettoken,只有排查 region 或单独接入时才需要。
返回当前可用 token 与 region。默认遵循配置文件里的 region 选择模式。
| 参数 | 说明 |
|---|---|
regions |
指定本次可接受的 region。支持逗号分隔,也支持重复传参;顺序表示优先级。 |
anyRegion=true |
本次忽略默认 region 配置,拿到什么 region 就返回什么。 |
GET /mstts/gettoken
GET /mstts/gettoken?regions=southeastasia
GET /mstts/gettoken?regions=southeastasia®ions=eastus®ions=westeurope
GET /mstts/gettoken?anyRegion=true
默认 Region 与差异
默认首选 southeastasia、eastus、westeurope。这三个 region 是当前公共预览语音测试中覆盖最完整的返回区域,优先用于减少 HD、Preview 和 multi-talker 音色缺失。
同一个接口还能拿到 eastasia、northeurope、westus 等 region;这些区域可以用于常规音色,但公共预览、HD、multi-talker 或新增音色的覆盖可能少于默认三项。具体音色不要写死,建议用 /mstts/getvoice 或管理后台的“获取可用 Region”按当前返回确认。
Priority 模式会按 region 列表顺序选择。服务会在最大尝试次数内保留本轮拿到过的最高优先级 region;如果拿到第一优先级 region,会立即返回。失败响应会列出本轮尝试拿到的所有 region,方便判断微软当前返回情况。
管理后台
/admin 用账号密码登录,不使用 ApiAuth.Token。后台可以修改配置、刷新微软 token、查看 data 目录状态、统计和清理自定义配置快照。
配置页默认用有序列表管理 Region 优先级。点击“获取可用 Region”后,勾选会追加到列表末尾,取消勾选会从列表移除;点击已选 Region 可以展开上移、下移和移除操作。手动文本编辑保留在“自定义编辑”折叠项里。
首次登录
- 启动服务后打开
/admin。 - 使用
/app/data/admin-initial-password.txt里的临时密码登录。 - 首次登录后修改密码。
/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 |
字符串数组,默认 southeastasia、eastus、westeurope。顺序表示优先级;后台可以用有序列表调整,也保留换行、英文逗号或分号分隔的自定义文本编辑。 |
RegionSelectionMode |
枚举:Priority、FirstMatch、Auto。Priority 按列表顺序优先选择,拿到第一项立即返回,否则在尝试结束后使用本轮拿到过的最高优先级 region;FirstMatch 拿到列表内任意 region 就立即返回;Auto 忽略默认列表,微软返回什么就用什么。 |
RegionMatchMaxAttempts |
整数 1-200,默认 30。仅 Priority 或 FirstMatch 模式用于匹配首选 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 后,建议重启容器。