@degreesign/voice

中文文档
2.4.2发布于 2026/11/09MITTypeScriptCommonJS近 30 天下载 3294

网络和节点的线下拼写、文字到文字和文字到语音(TTS)

中文使用文档
文档目录20 节
  1. 目录
  2. 为什么
  3. 安装
  4. 光盘N
  5. 快开始
  6. 浏览器麦克风
  7. PCM 输入
  8. 对文本的发言
  9. 选项
  10. 型号加载
  11. 音频和时间安排
  12. 重量镜像
  13. 语音文本
  14. 语音克隆
  15. 拼写
  16. 演示
  17. 模型
  18. 储存和性能
  19. 建筑
  20. 许可证发放

@ 学位标志/ 语音

将语音转换成文字, 私下, 由用户自己使用 设备。 用它来形容、语音笔记、抄本、语音到文字、文字 转到语音和TTS,之后没有云服务、账户或网络连接 设置.

npm version license node types

试试现场演示 要运行语音到 文本和文本到浏览器中的语音,没有安装.

目录

为什么

  • 下行:重量下载一次,然后每个解码都运行在机器上.
  • 流线 : transcribe 返回活控并不断更新音频 来了.
  • 1 API:同名条目自动检测出Node.js和浏览器.
  • 任何音频: 16千赫单PCM, a Blob 或者说 File、 URL、 文件系统路径或 浏览器麦克风.
  • 已打入: TypeScript 声明覆盖了每次导出.
  • 两个方向:语音到文字,文字到语音.
  • 自控: 缓存、 存储和音频解码器在构建时捆绑 时间.

多莉丝蒂 将软件包用于任务描述和语音 注释.

安装

npm install @degreesign/voice
yarn add @degreesign/voice
pnpm add @degreesign/voice

需要24号节点或更新。 主要出口的确认和 语音库. 口述控制器有自己的条目.

公布的文件有:

  • dist/node/degreesign.node.min.js,用于节点的 CommonJS 条目.
  • dist/browser/degreesign.min.js,完整的UMD条目为 window.dsVoice。 。 。 .
  • dist/browser/whisper.min.js,仅Whisper的UMD条目为 window.dsVoiceWhisper。 。 。 .
  • dist/browser/dictation.min.js(原始内容存档于2017-03-26). Dictation UMD 条目.
  • dist/browser/dictation.worker.js那个预建的拼写工.

从源创建到 yarn build 输入 yarn typecheck。 。 。 .

光盘N

<script src="https://cdn.jsdelivr.net/npm/@degreesign/voice@latest/dist/browser/degreesign.min.js"></script>

试试看 现场演讲演示 在安装前。 它在浏览器中运行语音到文本和语音.

快开始

浏览器麦克风

<script src="https://cdn.jsdelivr.net/npm/@degreesign/voice@latest/dist/browser/degreesign.min.js"></script>
<script>
  const { Language, transcribe } = window.dsVoice;
  const session = transcribe({ language: Language.auto });
  const timer = setInterval(() => {
    output.textContent = session.fullText().text;
  }, 500);
  stopButton.onclick = async () => {
    clearInterval(timer);
    const result = await session.stop();
    output.textContent = result.text;
  };
</script>

浏览器会话没有 pcm,没有 audioFilePath 没有要求手动种子 麦克风访问和记录,直到 stop。 。 。 .

PCM 输入

输入为 16 kHz 单 Float32Array PCM (英语).

import { Language, transcribe } from "@degreesign/voice";

const session = transcribe({ pcm, language: Language.auto });
console.log(session.fullText().text);

const result = await session.done;
console.log(result.text, result.duration, result.meta.rtf);

先给模特取暖,打个电话 preloadVoice在音频到达的时候, 通过 microphone: false 并附带样本 push。 。 。 .

对文本的发言

transcribe(options?) 返回 a TranscribeSession 马上.

成员说明
fullText()最新文本和解码时间。 便宜而同步.
push(pcm)附加 16 kHz 单采样 microphone: false。 。 。 .
stop()停止抓取或输入,冲出尾部并下定决心.
cancel()丢弃待发音频并解析, 没有最终解码 .
done在输入结束后决定, stop 或者说 cancel。 。 。 .
error首先同步失败,或者 null。 。 。 .

选项

外地说明
modelModelId.WhisperBase唯一一个模特儿.
pcm16千赫单相 Float32Array,最高优先来源.
audioFilePathURL 字符串, Blob 或者说 File,或节点文件系统路径.
microphone抓住麦克风 默认为 true· ; false 接受 push。 。 。 .
language音频语言或 Language.auto。默认自动检测.
qualityQuality.High (F16) 默认, Medium (问题8 0)或 Low (问题4 K M).
timestampsTimestampMode.none, (中文(简体) ), .segment 或者说 .word。 。 。 .
lowLatency跳过30秒垫。 默认为 true。 。 。 .
allowedDiskSpaceMBMB 缓存盖 。 默认为 512。 。 。 .
updateIntervalMs现场更新 Cadence in ms. 默认为 1000。 。 。 .
weightsBaseUrl重量主机,默认为 https://huggingface.co。 。 。 .
weightCacheMBMB中的F32起式缓存盖.
threadsThreadCount.Two, (中文(简体) ), .Four 或者说 .Eight默认为 Four。 。 。 .
onProgress在每个文件中下载并加载进度 .

型号加载

import {
    Language,
    ModelId,
    Quality,
    isModelCached,
    loadModel,
    preloadVoice,
} from "@degreesign/voice";

await preloadVoice({
    model: ModelId.WhisperBase,
    language: Language.en,
    quality: Quality.Low,
});

const cached = await isModelCached({
    model: ModelId.WhisperBase,
    language: Language.en,
    quality: Quality.Low,
});
const model = await loadModel({
    model: ModelId.WhisperBase,
    language: Language.en,
    quality: Quality.Low,
});

preloadVoice 提前下载并加载一个模型. loadModel 返回时 装入的模型. isModelCached 在不使用网络的情况下检查商店. 明确 Language.en 选择仅有的英文检查点; 所有其他 语言,包括 Language.auto,使用多语种检查站.

音频和时间安排

第一个来源获胜: pcm,则 audioFilePath,然后是一个 手动种子 microphone: false,然后是浏览器麦克风.

在节点中,路径从文件系统读取并解码为WAV,FLAC或MP3. 在浏览器中获取 URL, a Blob 或者说 File 直接读取,以及 解码使用Web Audio API. 支持的浏览器格式取决于 浏览器.

下面的音频 -50 dBFS 作为沉默处理,返回空文本,不包含 触摸模型。 短于一秒钟的可读输入集中在 沉默,所以被剪辑的单词保持了两侧上下文.

一段会话在12秒后暂停等待音频,没有音频,或 当停止。 已执行的文本不再更改, 其音频已发布, 因此 内存在长相录音时会被限制. msElapsed 财务报告和审定财务报表 meta.rtf 覆盖 解码只工作,不下载,加载,音频解码或等待音频.

重量镜像

设定 weightsBaseUrl 服务于您所在的检查站:

await preloadVoice({
    weightsBaseUrl: "https://models.example.com",
});

镜像保持了"拥抱相貌"的布局: <base>/<repo>/resolve/main/<file>读取GGUF的重量 handy-computer 仓库和文本文件 openai 存储器. 支助 Range 请求允许可重复的平行下载.

语音文本

语音库有两个48千赫的声音. 两者都使用MOSS-TTS-Nano 100M和克隆 被捆绑的参考代码,因此不下载参考记录. 每个声音 第一次使用大约需要133 MB 。 已经捆绑了 16 kHz 预览片段 .

语音编号型号产出
妇女VoiceId.Female最低业务安全标准-TTS-Nano 100M48千赫兹
男性VoiceId.Male最低业务安全标准-TTS-Nano 100M48千赫兹

文本本身选择了20种最低业务安全标准语言之一:阿拉伯文、中文、捷克文、, 丹麦语、英语、法语、德语、希腊语、希伯来语、匈牙利语、意大利语、日语, 朝鲜语、波斯语、波兰语、葡萄牙语、俄语、西班牙语、瑞典语和土耳其语.

import {
    VoiceId,
    getVoiceSample,
    isVoiceCached,
    listVoices,
    loadVoice,
    removeVoice,
    synthesize,
} from "@degreesign/voice";

const voices = listVoices();
const sample = getVoiceSample(VoiceId.Female);
console.log(voices.map((voice) => voice.label), sample.sampleRate);

if (!(await isVoiceCached(VoiceId.Female))) {
    await loadVoice({
        voice: VoiceId.Female,
        onProgress: ({ phase, ratio }) => console.log(phase, ratio),
    });
}

const audio = await synthesize({
    voice: VoiceId.Female,
    text: "Hello from @degreesign/voice.",
});
// audio.pcm is mono Float32 at audio.sampleRate.

await removeVoice(VoiceId.Female);
函数说明
listVoices()每一个语音谱,按照库序.
getVoiceSpec(voice)一个带有文件、许可证和预览行的光谱 .
getVoiceSample(voice)被捆绑的WAV字节和剪辑率.
isVoiceCached(voice)每个语音文件被存储时为真 .
loadVoice(options)下载语音文件 。 接受 weightsBaseUrl。 。 。 .
prepareVoice(options)下载并解析不说话的声音 .
synthesize(options)文本和返回 VoiceAudio。 。 。 .
removeVoice(voice)删除已缓存的声音文件 .

synthesize 接受可选 pitch 以半音为单位, rate 线性 gain。 。 。 . 皮奇和速率在合成后适用于每个语音. 最低业务安全标准的声音 接受 seed 财务报告和审定财务报表 temperature。增益默认值为 2, 投出值为 0 和 比率 对一个。 解析后重量保持不变,直到另一个声音取代它们.

语音克隆

cloneVoice 记录浏览器麦克风3秒钟并编码 使用最低业务安全标准音频显示器录制。 第一次通话下载45MB 编码器,然后保持它居住.

import { cloneVoice, synthesize, VoiceId } from "@degreesign/voice";

const clone = await cloneVoice({ durationMs: 3000 });
const audio = await synthesize({
    voice: VoiceId.Female,
    text: "This is the recorded voice.",
    reference: clone.codes,
});

A 类 VoiceClone 持有 codes,帧数和原生48千赫速率. 存储 在页面上重新使用同一声音而不再次录制的代码 :

const audio = await synthesize({
    voice: VoiceId.Male,
    text: "The stored reference still speaks.",
    reference: clone.codes,
});

过 pcm 与 sampleRate 以编码您已经拥有的录音。 这个 编码器再被复制到48千赫并保持了最多4秒. 简称 超过一秒钟被否决. onProgress 遵循编码器下载.

拼写

@degreesign/voice/dictation 是用于直播麦克风的无头控制器 相会. 它拥有工人,捕捉,暂停状态,模型进步和部分 语句。 该页保留了自己的标记和副本.

复制页面旁边的预建工人,或者从同一个来源路径为它服务:

cp node_modules/@degreesign/voice/dist/browser/dictation.worker.js \
  public/dictation.worker.js
import {
    createDictation,
    DictationState,
    Language,
} from "@degreesign/voice/dictation";

const dictation = createDictation({
    workerUrl: "/dictation.worker.js",
    language: Language.en,
    onState: (state, { modelReady, ratio }) => {
        status.textContent = state === DictationState.recording && modelReady
            ? "Listening"
            : `${state} ${Math.round(ratio * 100)}%`;
    },
    onText: (text) => {
        input.value = text;
    },
    onError: ({ source, message }) => console.error(source, message),
});

micButton.onclick = () => void dictation.start();
pauseButton.onclick = () => dictation.togglePause();
doneButton.onclick = () => void dictation.finish();
cancelButton.onclick = () => dictation.cancel();

主要选项是: workerUrl 或者说 workerFactory, (中文(简体) ), model, (中文(简体) ), language, (中文(简体) ), quality, (中文(简体) ), threads, (中文(简体) ), timestamps, (中文(简体) ), updateIntervalMs, (中文(简体) ), partialIntervalMs, (中文(简体) ), onState, (中文(简体) ), onText, (中文(简体) ), onFrequency, (中文(简体) ), onError 和高级 capture 超过。 一个控制器属于一个输入或组件. 主计长: 页面共享一个工人,从一个开始取消活动的工人。 取消发送 onText("", true) 这样页面就可以恢复其基础文本.

各州是 idle, (中文(简体) ), requesting, (中文(简体) ), recording, (中文(简体) ), paused, (中文(简体) ), loading 财务报告和审定财务报表 working。控制器的方法是 start, (中文(简体) ), pause, (中文(简体) ), resume, (中文(简体) ), togglePause, (中文(简体) ), finish, (中文(简体) ), cancel, (中文(简体) ), reset, (中文(简体) ), active, (中文(简体) ), state 财务报告和审定财务报表 destroy。 。 。 .

演示

打开 现场演示 尝试 在安装前在浏览器中双向移动。 装入 @degreesign/voice 从jsDelivr 并让你:

  • 从麦克风录音或选取音频文件并阅读记录稿.
  • 选一出出声,调音投出,收分,收分,温度和种子,再听.
  • 记录一个引用,用被克隆的声音来表达文字.

语音演示为文本使用 Quality.Low,59MB下载. 演示 来源是 文件/索引.html运行 node test/example/serve.cjs,然后打开 http://127.0.0.1:17544/docs/index.html 以服务当地.

模型

编号检查站语文
ModelId.WhisperBase华声基地多语种
ModelId.WhisperBase + 键 Language.en耳语基础.en联合国

低语基数使用 handy-computer/whisper-base-gguf 与 openai/whisper-base 文本文件。 英国检查站使用 handy-computer/whisper-base.en-gguf 与 openai/whisper-base.en两种份额 一个 ModelId,一个使用记录和一个 meta.model。 。 。 .

重量公布为F16,Q8 0和Q4 K M. Quality.High 默认值.

Quality重量华声基地耳语基础.en
HighF16 导弹151 甲基溴151 甲基溴
Medium问题8 085 MB 设备85 MB 设备
Low问题4 K M59 MB (英语)59 MB (英语)

被量化的文件在第一次访问时被分解为F32. 内核是 所以质量会改变下载的大小 和第一次访问的成本, 而不是稳定状态解码路径.

储存和性能

节点.js 存储模型文件通过 @degreesign/cache 下级 ~/.cache/decoder。浏览器将其存储于索引数据库 @degreesign/storage。 。 。 .

重量作为4个米B块存储,其中包含一个清单,文本文件为JSON,以及 usage.json 跟踪磁盘预算的大小和最后使用。 下载使用四个 平行 Range 从存储块中请求并恢复 。 失败块是 在整个文件回归到一流之前,通过备份重新进行了测试.

allowedDiskSpaceMB 封盖存储模型字节并默认为512. 一个模型 已经缓存 .

该图以WebAssembly SIMD内核运行在CPU上. threads 默认为 ThreadCount.Four。浏览器需要交叉原产地隔离 Cross-Origin-Opener-Policy: same-origin 财务报告和审定财务报表 Cross-Origin-Embedder-Policy: require-corp 使用工人池;无 引擎使用单一线程路径。 F32收发机缓存 默认检查站一次; weightCacheMB 下盖.

建筑

承诺地图 文件/档案.html 显示 档案和发挥乐队的作用,从公众进入到模范家庭, 百度运行时间,平台商店和音频输入. 离线了 HTML文件. 直接打开并用面板追踪一个电话.

许可证发放

这个寄存器的运行时间代码是MIT许可的. 轻声的重量和象征 数据为Apache-2.0. 最低业务安全标准TTS权重、指示器和参考码是 阿帕奇2.0 (英语). 捆绑的 MP3 解码器是 CC0 和 minimp3-wasm 约束是 阿帕奇2.0 (英语). 见 第三个 财务报告和审定财务报表 自由主义。 。 。 .

版本与发布记录

@degreesign/voice 共发布 22 个版本,首次发布于 2026/10/20;过去 12 个月发布了 22 个版本。

版本发布日期距今
2.4.2latest2026/11/092 天前
2.4.12026/11/092 天前
2.4.02026/11/092 天前
2.3.22026/11/092 天前
2.3.12026/11/092 天前
2.3.02026/11/092 天前

关于 @degreesign/voice 的常见问题

@degreesign/voice 是什么?

网络和节点的线下拼写、文字到文字和文字到语音(TTS)

如何安装 @degreesign/voice?

在项目目录运行 npm install @degreesign/voice,或使用 pnpm add / yarn add / bun add。

@degreesign/voice 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@degreesign/voice 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@degreesign/voice 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@degreesign/voice 可以商用吗?

@degreesign/voice 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@degreesign/voice 的下载量有多少?

根据 npm 官方下载统计,@degreesign/voice 在 2026/10/12 – 2026/11/10 这 30 天内被下载 3,294 次,日均约 110 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@degreesign/voice 还在维护吗?

最新版本 2.4.2 发布于 2026/11/09(2 天前);至今共发布 22 个版本,其中过去 12 个月发布了 22 个;首次发布于 2026/10/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。