New:Introducing Socket Scanning for VS Code Marketplace Extensions.Learn more →
Get Started

univoice

Package Overview
Dependencies
Maintainers
1
Versions
21
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

univoice

Unified Voice SDK for TTS and ASR

latest
Source
npmnpm
Version
0.11.0
Version published
Weekly downloads
0
Maintainers
1
Weekly downloads
 
Created
Source


Univoice


npm version npm downloads License codecov

统一的 TTS(文字转语音)和 ASR(语音识别)SDK

快速开始 · API 文档 · 支持的提供商

简介

univoice 是一个统一的语音处理 SDK,提供统一的 API 来调用多种 TTS(文字转语音)和 ASR(语音识别)服务提供商。

核心特性

  • 🎯 统一 API - 一套 API 调用多种语音服务提供商
  • 🔄 流式支持 - TTS 支持流式输入和输出,适合 LLM 流式输出场景
  • 🚀 边发边收 - LLM 流式输出可直接转换为语音,显著降低首字延迟
  • 🔌 插件化架构 - 轻松扩展支持新的语音服务提供商
  • 📦 TypeScript 优先 - 完整的类型定义支持
  • 🌳 Tree-Shaking 支持 - 按需加载,减少打包体积

适用场景

  • AI 助手语音交互
  • 有声书/播客生成
  • 客服语音系统
  • 实时语音翻译
  • 语音消息应用

安装

# 使用 pnpm
pnpm add univoice

# 使用 npm
npm install univoice

# 使用 yarn
yarn add univoice

环境要求

  • Node.js >= 20.0.0

快速开始

TTS(文字转语音)

非流式合成

最简单的使用方式,适合已知完整文本的场景:

import { createTTS } from 'univoice';

const tts = createTTS({
  provider: 'doubao',
  appId: 'your-app-id',
  accessToken: 'your-access-token',
  voice: 'zh_female_tianmeixiaoyuan_moon_bigtts',
  format: 'mp3',
});

const response = await tts.synthesize({
  text: '欢迎来到杭州!',
});

console.log(`音频格式: ${response.format}`);
console.log(`音频大小: ${response.audio.length} bytes`);

流式合成

适合流式输入场景,支持两种输入模式:

import { createTTS } from 'univoice';

const tts = createTTS({
  provider: 'doubao',
  appId: 'your-app-id',
  accessToken: 'your-access-token',
  voice: 'zh_female_tianmeixiaoyuan_moon_bigtts',
  format: 'pcm',
  sampleRate: 24000,
});

// 方式一:字符串输入
const text = '欢迎来到龙井村。这里是西湖龙井茶的原产地。';
for await (const { audioChunk } of tts.speak(text)) {
  console.log('收到音频块:', audioChunk.length);
}

// 方式二:流式文本输入(如 Generator)
async function* textGenerator() {
  yield '你好,';
  yield '世界!';
}
for await (const { audioChunk } of tts.speak(textGenerator())) {
  console.log('收到音频块:', audioChunk.length);
}

LLM 流式输出转语音(核心特性)

将 LLM 的流式输出直接转换为语音,实现边发边收,显著降低首字延迟:

import OpenAI from 'openai';
import { createTTS } from 'univoice';

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const tts = createTTS({
  provider: 'doubao',
  appId: 'your-app-id',
  accessToken: 'your-access-token',
  voice: 'zh_female_tianmeixiaoyuan_moon_bigtts',
  format: 'pcm',
  sampleRate: 24000,
});

// 创建 OpenAI 流式请求
const openaiStream = await openai.chat.completions.stream({
  model: 'gpt-4o-mini',
  messages: [{ role: 'user', content: '请介绍 TypeScript' }],
  stream: true,
});

// 直接将 OpenAI stream 传入 TTS speak
const chunks: Uint8Array[] = [];
for await (const { audioChunk } of tts.speak(openaiStream)) {
  chunks.push(audioChunk);
  console.log('收到音频块');
}

// 保存音频
import { writeFileSync } from 'node:fs';
const buffer = Buffer.concat(chunks.map(c => Buffer.from(c)));
writeFileSync('output.pcm', buffer);

保存音频

使用工具函数快速保存音频:

import { createTTS, saveAudio } from 'univoice';

const tts = createTTS({ /* config */ });

// 直接保存流式输出
await saveAudio('output.pcm', tts.speak('你好,世界!'));

// 保存非流式输出
import { saveTTSResponse } from 'univoice';
const response = await tts.synthesize({ text: '你好' });
const filepath = await saveTTSResponse(response);
console.log(`已保存到: ${filepath}`);

ASR(语音识别)

import { createASR } from 'univoice';
import { readFileSync } from 'node:fs';

const asr = createASR({
  provider: 'openai',
  apiKey: 'your-api-key',
  model: 'whisper-1',
});

const audioBuffer = readFileSync('audio.mp3');

// 流式识别
for await (const chunk of asr.listen(audioBuffer)) {
  console.log(`识别文本: ${chunk.text}`);
  if (chunk.isFinal) {
    console.log('识别完成');
  }
}

按需加载(Tree-Shaking)

univoice 支持 tree-shaking,你可以按需加载所需的 provider,减少打包体积。

方式一:自动注册全部 Provider

适合需要使用多个 provider 的场景:

import 'univoice/tts/providers';  // 注册所有 TTS provider
import { createTTS } from 'univoice/tts';

const tts = createTTS({ provider: 'doubao', ... });

方式二:手动注册单个 Provider(推荐)

只打包需要的 provider,最小化打包体积:

import { createTTS, registerTTSProvider } from 'univoice/tts';
import { DoubaoTTS } from 'univoice/tts/providers/doubao';

// 只注册需要的 provider
registerTTSProvider('doubao', DoubaoTTS);

const tts = createTTS({ provider: 'doubao', ... });

方式三:直接使用 Provider 类

最精简的方式,不使用工厂函数:

import { DoubaoTTS } from 'univoice/tts/providers/doubao';

const tts = new DoubaoTTS({
  appId: 'your-app-id',
  accessToken: 'your-access-token',
  // ...
});

const response = await tts.synthesize({ text: '你好' });

可用导入路径

路径说明
univoice主入口,导出所有 API(不自动注册 provider)
univoice/ttsTTS 模块入口
univoice/tts/providers自动注册所有 TTS provider
univoice/asrASR 模块入口
univoice/asr/providers自动注册所有 ASR provider

API 文档

TTS API

创建实例

import { createTTS } from 'univoice';

const tts = createTTS({
  provider: 'doubao' | 'openai' | 'minimax' | 'qwen' | 'qwen-realtime' | 'gemini' | 'glm' | 'xfyun',
  // 通用配置
  apiKey?: string,
  baseUrl?: string,
  model?: string,
  voice?: string,
  format?: 'mp3' | 'wav' | 'ogg' | 'flac' | 'pcm',
  speed?: number,
  volume?: number,
  pitch?: number,
  language?: string,
  // doubao 专用
  appId?: string,
  accessToken?: string,
  resourceId?: string,
  sampleRate?: number,
});

方法

方法说明返回类型
tts.synthesize(request)非流式合成Promise<TTSResponse>
tts.speak(input)流式合成AsyncIterable<TTSStreamChunk>
tts.listVoices?()列出可用声音Promise<TTSVoice[]>

工具函数

函数说明
saveTTSResponse(response, options)保存 TTS 响应到文件
saveAudio(filename, stream)保存流式音频到文件
collectAudio(response, options)收集音频数据
playAudio(response, options)播放音频
teeAudio(response, options)同时保存和播放

ASR API

创建实例

import { createASR } from 'univoice';

const asr = createASR({
  provider: 'doubao' | 'openai' | 'minimax' | 'qwen' | 'gemini' | 'glm' | 'xfyun',
  apiKey?: string,
  baseUrl?: string,
  model?: string,
  language?: string,
  prompt?: string,
  responseFormat?: 'json' | 'text' | 'srt' | 'vtt' | 'verbose_json',
});

方法

方法说明返回类型
asr.listen(audio)流式语音识别AsyncIterable<ASRStreamChunk>

工具函数

函数说明
saveText(text, options)保存识别文本到文件
collectText(response, options)收集识别结果

支持的提供商

能力矩阵

各提供商对输入输出模式的支持情况如下,帮助您根据实际场景选择合适的提供商。

ASR 能力矩阵

提供商标识符流式输入一次性输入流式输出一次性输出
豆包(火山引擎)doubao✅✅✅✅
通义千问qwen✅✅✅✅
智谱 GLMglm❌✅✅✅
OpenAIopenai待实现待实现待实现待实现
MiniMaxminimax----
Geminigemini待实现待实现待实现待实现
科大讯飞xfyun✅✅✅✅

TTS 能力矩阵

提供商标识符流式输入一次性输入流式输出一次性输出
豆包(火山引擎)doubao✅✅✅✅
通义千问qwen✅✅✅✅
智谱 GLMglm❌✅✅✅
OpenAIopenai待实现待实现待实现待实现
MiniMaxminimax✅✅✅✅
Geminigemini待实现待实现待实现待实现
科大讯飞xfyun✅✅✅✅

能力说明

能力说明
流式输入支持边发边收,如 LLM 流式输出直接转语音、实时音频流识别
一次性输入一次性发送完整文本/音频
流式输出结果以流的形式返回,适合实时处理场景
一次性输出返回完整结果,适合批量处理场景

配置示例

豆包(火山引擎)

const tts = createTTS({
  provider: 'doubao',
  appId: process.env.DOUBAO_APP_ID,
  accessToken: process.env.DOUBAO_ACCESS_TOKEN,
  voice: 'zh_female_tianmeixiaoyuan_moon_bigtts',
  resourceId: 'seed-tts-2.0',
  format: 'mp3',
  sampleRate: 24000,
});

OpenAI

const tts = createTTS({
  provider: 'openai',
  apiKey: process.env.OPENAI_API_KEY,
  model: 'tts-1',
  voice: 'alloy',
  speed: 1.0,
});

const asr = createASR({
  provider: 'openai',
  apiKey: process.env.OPENAI_API_KEY,
  model: 'whisper-1',
  language: 'zh',
});

MiniMax

const tts = createTTS({
  provider: 'minimax',
  apiKey: process.env.MINIMAX_API_KEY,
  groupId: process.env.MINIMAX_GROUP_ID,
  voice: 'female-tianmei',
  format: 'mp3',
});

通义千问

const tts = createTTS({
  provider: 'qwen',
  apiKey: process.env.QWEN_API_KEY,
  model: 'cosyvoice-v3-flash',
  voice: 'longxiaochun_v3',
  format: 'mp3',
});

const asr = createASR({
  provider: 'qwen',
  apiKey: process.env.QWEN_API_KEY,
  model: 'paraformer-realtime-v2',
  language: 'zh-CN',
  format: 'mp3',
});

Gemini

const tts = createTTS({
  provider: 'gemini',
  apiKey: process.env.GEMINI_API_KEY,
  voice: 'Kore',
  language: 'zh-CN',
});

智谱 GLM

const tts = createTTS({
  provider: 'glm',
  apiKey: process.env.GLM_API_KEY,
  model: 'glm-tts',
  voice: 'tongtong', // 可选: xiaochen, chuichui, jam, kazi, douji, luodo, female, male
  format: 'pcm',     // 支持 wav 和 pcm,流式只支持 pcm
});

const asr = createASR({
  provider: 'glm',
  apiKey: process.env.GLM_API_KEY,
  model: 'glm-asr-2512',
  hotwords: ['人工智能', '机器学习'], // 可选:热词列表,提高特定词汇识别准确率
  context: '这是一段技术演讲',        // 可选:上下文文本,用于长文本场景优化
});

科大讯飞

const tts = createTTS({
  provider: 'xfyun',
  appId: process.env.XFYUN_APP_ID,
  apiSecret: process.env.XFYUN_API_SECRET,
  apiKey: process.env.XFYUN_API_KEY,
  voice: 'x5_lingxiaoxuan_flow',
  model: 'super-human-tts',
  format: 'pcm',
  sampleRate: 16000,
});

const asr = createASR({
  provider: 'xfyun',
  appId: process.env.XFYUN_APP_ID,
  apiSecret: process.env.XFYUN_API_SECRET,
  apiKey: process.env.XFYUN_API_KEY,
  language: 'zh-CN',
});

Univoice 性能基准测试报告

⚠️ 重要说明

本报告仅反映在使用 univoice 时不同服务商和模型之间的相对性能差异,仅供参考,不代表服务商和模型的绝对性能。

实际测试结果受多种因素影响,包括但不限于:

  • 网络波动与延迟
  • 测试环境与地理位置
  • univoice 的实现方式
  • 服务商当前的负载情况
  • 服务商对模型的迭代

如需评估服务商的真实性能,建议直接使用服务商官方 SDK 进行测试。

生成时间: 2026/4/9 20:47:20

环境: Node.js v24.14.0, darwin arm64

TTS 性能指标

场景说明

场景说明
非流式入/流式出完整文本输入,实时音频流输出
非流式入/非流式出完整文本输入,完整音频返回

指标说明

指标含义计算方法作用
首包延迟从发送请求到收到第一个音频块的时间所有测试首包延迟的平均值反映 TTS 服务的响应速度
平均间隔稳定状态下平均每个 chunk 的间隔时间(总耗时 - 首包延迟) / (chunk数 - 1) 的平均值反映 TTS 服务吐数据块的节奏
P50中位数,50% 请求低于此值所有耗时排序后取中位数反映典型请求的性能
P9595% 请求低于此值所有耗时排序后取第95百分位评估尾部延迟,了解最坏情况
标准差延迟的离散程度各耗时与平均值差值的平方的均值的平方根值越小性能越稳定
吞吐量每秒处理的字符数文本长度 / 平均耗时(秒)值越大处理效率越高

非流式入/流式出

服务商模型音色编码格式采样率 (Hz)测试次数首包延迟 (ms)平均间隔 (ms)P50 (ms)P95 (ms)标准差 (ms)吞吐量 (chars/s)
通义千问cosyvoice-v3-flashlonganyangpcm8000662411887261018483864.1
通义千问cosyvoice-v3-flashlonganyangpcm1600065566485869838312977.1
通义千问cosyvoice-v3-flashlonganyangpcm22050657357832811354117865.2
通义千问cosyvoice-v3-flashlonganyangpcm240006704671102712958161954.0
通义千问cosyvoice-v3-flashlonganyangpcm44100653227855810379316876.3
通义千问cosyvoice-v3-flashlonganyangpcm480006578278588911244367.5
通义千问cosyvoice-v3-flashlonganyangopus8000972923881312104130792.0
通义千问cosyvoice-v3-flashlonganyangopus16000976023879713435344294.0
通义千问cosyvoice-v3-flashlonganyangopus2205018测试失败-----
通义千问cosyvoice-v3-flashlonganyangopus240009821208368138943968105.0
通义千问cosyvoice-v3-flashlonganyangopus441006测试失败-----
通义千问cosyvoice-v3-flashlonganyangopus4800012662218402170534134136.8
通义千问cosyvoice-v3-pluslonganyangpcm80006839153117541192351749.3
通义千问cosyvoice-v3-pluslonganyangpcm160006792811150912051406359.6
通义千问cosyvoice-v3-pluslonganyangpcm220506832691091611902102552.8
通义千问cosyvoice-v3-pluslonganyangpcm24000686875118091211719548.2
通义千问cosyvoice-v3-pluslonganyangpcm441006801341163111973398159.3
通义千问cosyvoice-v3-pluslonganyangpcm48000686837119001302488248.6
通义千问cosyvoice-v3-pluslonganyangopus80009106330118961262733171.7
通义千问cosyvoice-v3-pluslonganyangopus160009902221151412601430793.2
通义千问cosyvoice-v3-pluslonganyangopus220509测试失败-----
通义千问cosyvoice-v3-pluslonganyangopus2400098191711060118585180122.9
通义千问cosyvoice-v3-pluslonganyangopus441009测试失败-----
通义千问cosyvoice-v3-pluslonganyangopus4800098461711501123835206118.3
通义千问cosyvoice-v2longyingxiaopcm80006160299946112421353866.8
通义千问cosyvoice-v2longyingxiaopcm160006157567992911489346365.0
通义千问cosyvoice-v2longyingxiaopcm220506129949982911190361267.4
通义千问cosyvoice-v2longyingxiaopcm240006167360104351158987554.7
通义千问cosyvoice-v2longyingxiaopcm44100612993295631117691759.3
通义千问cosyvoice-v2longyingxiaopcm4800061700301086312202133653.8
通义千问cosyvoice-v2longyingxiaoopus8000692016818312148447585.7
通义千问cosyvoice-v2longyingxiaoopus160006114115928310047400884.3
通义千问cosyvoice-v2longyingxiaoopus220506测试失败-----
通义千问cosyvoice-v2longyingxiaoopus240006144320994211236330264.7
通义千问cosyvoice-v2longyingxiaoopus441006测试失败-----
通义千问cosyvoice-v2longyingxiaoopus480006108519918310977331670.5
通义千问cosyvoice-v1longwanpcm800066751146465653322089.6
通义千问cosyvoice-v1longwanpcm160006728586363677619988.9
通义千问cosyvoice-v1longwanpcm220506681436336703130388.2
通义千问cosyvoice-v1longwanpcm240006694396246756655187.8
通义千问cosyvoice-v1longwanpcm441006102923664110311142779.5
通义千问cosyvoice-v1longwanpcm480006661206626675321987.3
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherrypcm8000981512762697875745132.4
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherrypcm1600069031236208688733791.3
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherrypcm2400049611226331685451260.9
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherrypcm48000312741216379686741544.8
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherryopus800061039166191781168087.9
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherryopus1600041101166600692827357.4
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherryopus2400031078166665737244642.0
qwen-realtimeqwen3-tts-instruct-flash-realtimeCherryopus480003941166339685234644.5
qwen-realtimeqwen3-tts-flash-realtimeCherrypcm8000349481387738839174.7
qwen-realtimeqwen3-tts-flash-realtimeCherrypcm160003489853923460835569.3
qwen-realtimeqwen3-tts-flash-realtimeCherrypcm240003450823951413112571.8
qwen-realtimeqwen3-tts-flash-realtimeCherrypcm48000357079385938617374.8
qwen-realtimeqwen3-tts-flash-realtimeCherryopus80003508103918398713673.9
qwen-realtimeqwen3-tts-flash-realtimeCherryopus16000350111378638466875.6
qwen-realtimeqwen3-tts-flash-realtimeCherryopus240003473103899413112472.0
qwen-realtimeqwen3-tts-flash-realtimeCherryopus480003457103807413417673.3
qwen-realtimeqwen-tts-realtimeCherrypcm240003667634585489716961.1
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttspcm80003679623082337315690.3
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttspcm16000371061322432973587.8
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttspcm24000393511235319650299752.6
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttspcm480003760613181339715189.0
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttsogg_opus80003827603146372231886.8
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttsogg_opus160003653623254346123188.9
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttsogg_opus24000367010234297919220959.3
豆包seed-tts-1.0zh_male_lengkugege_emo_v2_mars_bigttsogg_opus480003698653217360320085.8
豆包seed-tts-2.0zh_female_vv_uranus_bigttspcm8000349165381038592974.6
豆包seed-tts-2.0zh_female_vv_uranus_bigttspcm16000350066375238324375.5
豆包seed-tts-2.0zh_female_vv_uranus_bigttspcm24000351065376037835076.3
豆包seed-tts-2.0zh_female_vv_uranus_bigttspcm48000356064377038354375.4
豆包seed-tts-2.0zh_female_vv_uranus_bigttsogg_opus8000351165373337987076.6
豆包seed-tts-2.0zh_female_vv_uranus_bigttsogg_opus16000350965374037615276.7
豆包seed-tts-2.0zh_female_vv_uranus_bigttsogg_opus24000351466381038374175.1
豆包seed-tts-2.0zh_female_vv_uranus_bigttsogg_opus480003476643631383912577.7
MiniMaxspeech-2.8-hdmale-qn-qingsepcm800033991024962728112110.9
MiniMaxspeech-2.8-hdmale-qn-qingsepcm160003431625332989295109.6
MiniMaxspeech-2.8-hdmale-qn-qingsepcm22050345832203237988126.4
MiniMaxspeech-2.8-hdmale-qn-qingsepcm240003453322813109436114.0
MiniMaxspeech-2.8-hdmale-qn-qingsepcm320003490327812945288107.0
MiniMaxspeech-2.8-hdmale-qn-qingsepcm44100346522323241061122.2
MiniMaxspeech-2.8-turbomale-qn-qingsepcm80003374 🏆81890 🏆2051 🏆88147.8 🏆
MiniMaxspeech-2.8-turbomale-qn-qingsepcm160003419525282876367115.7
MiniMaxspeech-2.8-turbomale-qn-qingsepcm22050338632188229880129.8
MiniMaxspeech-2.8-turbomale-qn-qingsepcm240003486324832679156114.6
MiniMaxspeech-2.8-turbomale-qn-qingsepcm320003395223822453169123.9
MiniMaxspeech-2.8-turbomale-qn-qingsepcm441003447223982489213124.2
MiniMaxspeech-2.6-hdmale-qn-qingsepcm800034841225522889174107.7
MiniMaxspeech-2.6-hdmale-qn-qingsepcm160003708628243097214100.6
MiniMaxspeech-2.6-hdmale-qn-qingsepcm220503554425813188296102.9
MiniMaxspeech-2.6-hdmale-qn-qingsepcm240003522427992902156103.9
MiniMaxspeech-2.6-hdmale-qn-qingsepcm320003490325262707164113.4
MiniMaxspeech-2.6-hdmale-qn-qingsepcm441003588228212943167102.9
MiniMaxspeech-2.6-turbomale-qn-qingsepcm8000347992201222553131.0
MiniMaxspeech-2.6-turbomale-qn-qingsepcm160003511522032574196123.9
MiniMaxspeech-2.6-turbomale-qn-qingsepcm220503458421572740318124.0
MiniMaxspeech-2.6-turbomale-qn-qingsepcm240003450319902484235132.4
MiniMaxspeech-2.6-turbomale-qn-qingsepcm32000352632291241586123.7
MiniMaxspeech-2.6-turbomale-qn-qingsepcm44100347622037211379140.9
MiniMaxspeech-02-hdmale-qn-qingsepcm8000349015268033871141126.5
MiniMaxspeech-02-hdmale-qn-qingsepcm16000349762485262590113.7
MiniMaxspeech-02-hdmale-qn-qingsepcm220503519426742795154108.3
MiniMaxspeech-02-hdmale-qn-qingsepcm24000352842785302511699.6
MiniMaxspeech-02-hdmale-qn-qingsepcm32000361032816343230394.8
MiniMaxspeech-02-hdmale-qn-qingsepcm44100355522837323119796.5
MiniMaxspeech-02-turbomale-qn-qingsepcm800034291019792730370129.1
MiniMaxspeech-02-turbomale-qn-qingsepcm160003456520262761431131.0
MiniMaxspeech-02-turbomale-qn-qingsepcm220503418425632919349113.2
MiniMaxspeech-02-turbomale-qn-qingsepcm240003862427142877277109.4
MiniMaxspeech-02-turbomale-qn-qingsepcm32000342421995212075141.2
MiniMaxspeech-02-turbomale-qn-qingsepcm441003436222442815270117.1
MiniMaxspeech-01-hdmale-qn-qingsepcm80003484102247230630125.9
MiniMaxspeech-01-hdmale-qn-qingsepcm16000350562531255946113.4
MiniMaxspeech-01-hdmale-qn-qingsepcm220503464423752483227125.5
MiniMaxspeech-01-hdmale-qn-qingsepcm240003538423252856266114.8
MiniMaxspeech-01-hdmale-qn-qingsepcm320003590325482634143114.3
MiniMaxspeech-01-hdmale-qn-qingsepcm441003592224322509136119.9
MiniMaxspeech-01-turbomale-qn-qingsepcm80003427102146224372132.4
MiniMaxspeech-01-turbomale-qn-qingsepcm16000351641965205559144.1
MiniMaxspeech-01-turbomale-qn-qingsepcm220503465420882247119135.9
MiniMaxspeech-01-turbomale-qn-qingsepcm24000347132048220174135.9
MiniMaxspeech-01-turbomale-qn-qingsepcm32000349022101214899138.6
MiniMaxspeech-01-turbomale-qn-qingsepcm4410034482 🏆1920210099145.2
智谱 GLMglm-ttstongtongpcm2400038615425037561429654.8
小米 Mimomimo-v2-ttsdefault_zhpcm24000-未测试-----
科大讯飞super-human-ttsx5_lingxiaoxuan_flowpcm800035431727042897119104.1
科大讯飞super-human-ttsx5_lingxiaoxuan_flowpcm160003511172629272151107.5
科大讯飞super-human-ttsx5_lingxiaoxuan_flowpcm240003592162690270928 🏆106.3

ASR 性能指标

场景说明

场景说明
流式入/流式出实时音频流输入,实时识别结果输出
非流式入/非流式出完整音频输入,完整结果返回
非流式入/流式出完整音频输入,实时识别结果输出

注意:标记 * 的场景使用 WebSocket 流式传输后聚合结果,并非原生非流式。

指标说明

指标含义计算方法作用
首包延迟从发送请求到收到第一个识别结果的时间所有测试首包延迟的平均值反映 ASR 服务的响应速度
平均间隔稳定状态下平均每个 chunk 的间隔时间(总耗时 - 首包延迟) / (chunk数 - 1) 的平均值反映 ASR 服务吐识别结果的节奏
P50中位数,50% 请求低于此值所有耗时排序后取中位数反映典型请求的性能
P9595% 请求低于此值所有耗时排序后取第95百分位评估尾部延迟,了解最坏情况
标准差延迟的离散程度各耗时与平均值差值的平方的均值的平方根值越小性能越稳定
RTF实时因子,处理时间与音频时长的比值处理耗时 / 音频时长值越小效率越高,<1 表示快于实时
准确率识别正确的字符比例正确字符数 / 总字符数值越高识别越准确
CER字符错误率,需编辑操作的字符比例(替换+删除+插入) / 总字符数值越低识别越准确

非流式入/流式出

服务商模型语言输入格式采样率 (Hz)测试次数首包延迟 (ms)平均间隔 (ms)P50 (ms)P95 (ms)标准差 (ms)RTF
通义千问paraformer-realtime-v2zh-CNpcm1600039788268520856661.32
通义千问paraformer-realtime-v1zh-CNpcm160003439 🏆29 🏆498 🏆509 🏆10 🏆0.57
豆包bigmodelzh-CNpcm160003513699049601070.99
科大讯飞iatzh-CNpcm1600031551927283529485870.12 🏆

数据更新于: 2026-04-14

开发指南

本地开发

# 克隆仓库
git clone https://github.com/shenjingnan/univoice.git
cd univoice

# 安装依赖
pnpm install

# 构建项目
pnpm build

# 运行测试
pnpm test

# 代码检查
pnpm lint

# 格式化代码
pnpm format

添加新提供商

  • 在 src/tts/providers/ 或 src/asr/providers/ 创建新文件
  • 继承 BaseTTS 或 BaseASR 类
  • 实现必要的方法
  • 导出 Provider 类
// src/tts/providers/my-provider.ts
import { BaseTTS } from '@/tts/index';
import type { TTSOptions, TTSRequest, TTSResponse } from '@/types/tts';

export class MyTTS extends BaseTTS {
  constructor(options: TTSOptions) {
    super(options);
  }

  async synthesize(request: TTSRequest): Promise<TTSResponse> {
    // 实现合成逻辑
    return {
      audio: Buffer.from('...'),
      format: 'mp3',
    };
  }
}

然后在 src/tts/providers/index.ts 中添加自动注册:

import { MyTTS } from './my-provider';
import { registerTTSProvider } from '../index';

registerTTSProvider('my-provider', MyTTS);

项目结构

src/
├── index.ts           # 主入口,导出所有公开 API
├── tts/               # TTS 模块
│   ├── base.ts        # BaseTTS 抽象类
│   ├── factory.ts     # 工厂函数
│   ├── protocols/     # 协议实现
│   │   ├── volcengine.ts
│   │   ├── dashscope.ts
│   │   ├── dashscope-realtime.ts
│   │   ├── minimax.ts
│   │   └── xfyun.ts
│   ├── utils/         # 工具函数
│   │   ├── save.ts
│   │   ├── save-audio.ts
│   │   ├── collect.ts
│   │   ├── play.ts
│   │   └── tee.ts
│   └── providers/     # 提供商实现
│       ├── doubao.ts
│       ├── openai.ts
│       ├── minimax.ts
│       ├── qwen.ts
│       ├── qwen-realtime.ts
│       ├── gemini.ts
│       ├── glm.ts
│       └── xfyun.ts
├── asr/               # ASR 模块
│   ├── base.ts        # BaseASR 抽象类
│   ├── factory.ts     # 工厂函数
│   ├── protocols/     # 协议实现
│   │   ├── dashscope.ts
│   │   ├── sauc.ts
│   │   └── xfyun.ts
│   ├── utils/         # 工具函数
│   │   ├── audio.ts
│   │   ├── collect.ts
│   │   ├── save.ts
│   │   ├── ogg-muxer.ts
│   │   └── opus-decode.ts
│   └── providers/     # 提供商实现
│       ├── doubao.ts
│       ├── openai.ts
│       ├── minimax.ts
│       ├── qwen.ts
│       ├── gemini.ts
│       ├── glm.ts
│       └── xfyun.ts
└── types/             # 类型定义
    ├── index.ts
    ├── tts.ts
    ├── asr.ts
    ├── llm-stream.ts
    └── voices/
        ├── doubao.ts
        ├── minimax.ts
        ├── qwen.ts
        └── glm.ts

许可证

Apache-2.0

贡献

欢迎提交 Issue 和 Pull Request!

致谢

感谢以下语音服务提供商:

Keywords

tts

FAQs

Package last updated on 25 Apr 2026

Related posts