Skip to content
围炉聊科技微信公众号二维码关注公众号,获取新文章推送
添加我为微信朋友扫描二维码,添加我为朋友

长期免费的语音合成与识别 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 NeuronsAura-1 英文合成成功;Whisper 中英文识别正确
Groq中英文 ASRFree Plan 的 Whisper 为 2,000 次/日中英文识别正确
硅基流动中英文 ASRSenseVoiceSmallTeleSpeechASR 当前价格页标为免费两个模型的中英文识别都正确
Azure Speech中英文 TTS、ASRF0:每月 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/SenseVoiceSmallTeleAI/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-AvaMultilingualNeuralzh-CN-XiaoxiaoMultilingualNeural 生成过两段 MP3,中文、英文短音频也都识别正确。配置时需要保存 Key 和区域名,例如:

env
AZURE_SPEECH_KEY=...
AZURE_SPEECH_REGION=eastus

怎么选

已经用 Cloudflare Workers 的,用它的 Whisper 做识别最省事,不用新注册账号和申请API KEY;想做中文 TTS,Azure F0 是这次最完整、也最稳定的选项。只做识别且不想开 Azure,Groq 的 2,000 次/日够宽松;国内项目则可以先试硅基流动的两个免费模型。这些免费入口适合原型、个人工具和低频功能。你可以关注我获取更多的零成本基建资讯。