切换主题
长期免费的语音合成与识别 API——零成本基建系列
上期介绍的是文生图API,这期介绍长期免费的语音合成与识别 API。同样的,只介绍有持续免费档位的服务,这里的“长期”不能保证永远免费,而是指截至目前官方有非一次性的免费规则的API。为确保API接口真实可用,每个API接口都用同一组短句跑过中英文测试才拿出来分享:
text
This is an English speech recognition test.
这是中文语音识别测试。识别用的测试语音是 Windows 内置语音生成的 16 kHz WAV。
| 服务 | 能做什么 | 当前免费规则 | 这次结果 |
|---|---|---|---|
| Cloudflare Workers AI | 英文 TTS、中英文 ASR | 免费计划每天 10,000 Neurons | Aura-1 英文合成成功;Whisper 中英文识别正确 |
| Groq | 中英文 ASR | Free Plan 的 Whisper 为 2,000 次/日 | 中英文识别正确 |
| 硅基流动 | 中英文 ASR | SenseVoiceSmall、TeleSpeechASR 当前价格页标为免费 | 两个模型的中英文识别都正确 |
| Azure Speech | 中英文 TTS、ASR | F0:每月 50 万神经语音字符、5 小时语音识别 | 中英文合成与识别都正确 |
Cloudflare 更擅长英文
Cloudflare Workers AI 免费计划每天有 10,000 Neurons,到 UTC 零点重置。 测试用 @cf/deepgram/aura-1 合成英文;识别用 @cf/openai/whisper-large-v3-turbo。两项都直接通过 Workers AI REST API 调用。关于如何注册申请API key请参考前一篇文章。
js
import { readFile, writeFile } from 'node:fs/promises';
const base = `https://api.cloudflare.com/client/v4/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/ai/run`;
const headers = {
Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`,
'Content-Type': 'application/json'
};
// 英文 TTS
const tts = await fetch(`${base}/@cf/deepgram/aura-1`, {
method: 'POST',
headers,
body: JSON.stringify({
text: 'This is an English text to speech test.',
speaker: 'asteria',
encoding: 'mp3'
})
});
await writeFile('cloudflare-en.mp3', Buffer.from(await tts.arrayBuffer()));
// 中英文 ASR:language 改成 en 或 zh
const audio = await readFile('asr-fixture-zh.wav');
const asr = await fetch(`${base}/@cf/openai/whisper-large-v3-turbo`, {
method: 'POST',
headers,
body: JSON.stringify({ audio: audio.toString('base64'), language: 'zh', task: 'transcribe' })
});
const { result } = await asr.json();
console.log(result.text);实测中,Aura-1 正常生成了英文 MP3;Whisper 对两句样本的返回分别是 This is an English speech recognition test. 和 这是中文语音识别测试。
Cloudflare 还有 @cf/myshell-ai/melotts 可以做中文 TTS。我拿同一句中文试过,曾成功拿到音频,也连续遇到两次服务端 500 / 3043。这个波动很难说是代码问题,因此不把它放进这次的推荐路径;中文合成直接看后面的 Azure 更稳妥。
Groq:只做识别,额度很大方
Groq 的语音接口兼容 OpenAI 风格。whisper-large-v3-turbo 在 Free Plan 的限额是 2,000 次/日;具体还有 RPM、音频时长等限制,直接看 Groq Rate Limits。注册申请也非常简单就不赘述了。
js
import { readFile, writeFile } from 'node:fs/promises';
const file = await readFile('asr-fixture-zh.wav');
const form = new FormData();
form.set('model', 'whisper-large-v3-turbo');
form.set('response_format', 'json');
form.set('file', new Blob([file], { type: 'audio/wav' }), 'asr-fixture-zh.wav');
const response = await fetch('https://api.groq.com/openai/v1/audio/transcriptions', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.GROQ_API_KEY}` },
body: form
});
const { text } = await response.json();
await writeFile('groq-zh.txt', text);
console.log(text);测试下来英文和中文都识别正确。它没有把语音合成塞进同一套免费入口,接口细节见 Groq Speech-to-Text 文档。
硅基流动:国内接口,两个免费 ASR 模型都能跑
硅基流动的价格页目前把 FunAudioLLM/SenseVoiceSmall 与 TeleAI/TeleSpeechASR 标为免费。价格页。
申请API Key前需要先完成实名。
这里有个很容易踩到的小坑。旧的英文文档示例写过 api.siliconflow.com,而现在的中文 API 文档指定的是 https://api.siliconflow.cn。前者会把一个完全正确的 Key 打成 401 Token is invalid。这次改到 .cn 后,四组请求就都通过了。
js
import { readFile, writeFile } from 'node:fs/promises';
async function transcribe(model, fileName) {
const file = await readFile(fileName);
const form = new FormData();
form.set('model', model);
form.set('file', new Blob([file], { type: 'audio/wav' }), fileName);
const response = await fetch('https://api.siliconflow.cn/v1/audio/transcriptions', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SILICONFLOW_API_KEY}` },
body: form
});
const { text } = await response.json();
await writeFile(`${model.split('/')[1]}.txt`, text);
return text;
}
console.log(await transcribe('FunAudioLLM/SenseVoiceSmall', 'asr-fixture-zh.wav'));
console.log(await transcribe('TeleAI/TeleSpeechASR', 'asr-fixture-en.wav'));SenseVoiceSmall 对中英文样本都原样返回;TeleSpeechASR 也正确识别了两句,只把英文里的 English 写成了小写。对命令、专有名词很多的真实录音,还是要自己再用一段业务音频验证。接口的文件上限是 50 MB、时长上限 1 小时,模型名以 官方转写文档 为准。
Azure Speech:中文合成和识别都很完整
Azure 的好处不止声音多。它的 TTS 与 ASR 是一套服务,中文神经语音、英文语音、短音频识别都能用。注意创建资源时要选 F0(免费);API 响应本身看不出资源是 F0 还是 S0,别因为接口跑通就默认没有计费风险。 Azure 目前的 F0 额度是每月 50 万神经语音字符、5 小时语音识别。实时语音合成限 20 次/60 秒,实时识别并发为 1,做个人工具足够,做高并发服务则不合适。Azure 价格页 和 配额文档 写得很清楚。
创建key相对复杂一些,需要先访问 https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices 来创建语音服务 
服务创建完成后进入该资源获取密钥 
js
import { readFile, writeFile } from 'node:fs/promises';
const region = process.env.AZURE_SPEECH_REGION;
const key = process.env.AZURE_SPEECH_KEY;
// 中文 TTS;英文可把 voice 换成 en-US-AvaMultilingualNeural
const tts = await fetch(`https://${region}.tts.speech.microsoft.com/cognitiveservices/v1`, {
method: 'POST',
headers: {
'Ocp-Apim-Subscription-Key': key,
'Content-Type': 'application/ssml+xml',
'X-Microsoft-OutputFormat': 'audio-16khz-128kbitrate-mono-mp3',
'User-Agent': 'voice-api-test'
},
body: '<speak version="1.0" xml:lang="zh-CN"><voice name="zh-CN-XiaoxiaoMultilingualNeural">这是中文语音合成测试。</voice></speak>'
});
await writeFile('azure-zh.mp3', Buffer.from(await tts.arrayBuffer()));
// 中文 ASR;英文时换 language=en-US 和输入文件
const audio = await readFile('asr-fixture-zh.wav');
const asr = await fetch(`https://${region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=zh-CN`, {
method: 'POST',
headers: {
'Ocp-Apim-Subscription-Key': key,
Accept: 'application/json',
'Content-Type': 'audio/wav; codecs=audio/pcm; samplerate=16000'
},
body: audio
});
console.log((await asr.json()).DisplayText);我用 en-US-AvaMultilingualNeural 和 zh-CN-XiaoxiaoMultilingualNeural 生成过两段 MP3,中文、英文短音频也都识别正确。配置时需要保存 Key 和区域名,例如:
env
AZURE_SPEECH_KEY=...
AZURE_SPEECH_REGION=eastus怎么选
已经用 Cloudflare Workers 的,用它的 Whisper 做识别最省事,不用新注册账号和申请API KEY;想做中文 TTS,Azure F0 是这次最完整、也最稳定的选项。只做识别且不想开 Azure,Groq 的 2,000 次/日够宽松;国内项目则可以先试硅基流动的两个免费模型。这些免费入口适合原型、个人工具和低频功能。你可以关注我获取更多的零成本基建资讯。


