@ai-ecoverse/pi-audio

中文文档
1.27.5发布于 2026/10/30Apache-2.0TypeScriptES Module零依赖构建来源已验证近 30 天下载 6122

Pi 语音绑定: pi-coding- agent 插件和 slic- agent 的语音对文本,文本对语音和实时语音

中文使用文档
文档目录12 节
  1. 跟经纪人谈的三种方式
  2. 模型和适配器
  3. 语音对文本和 TTS
  4. 声音转动
  5. 实时
  6. 回声取消
  7. 节点
  8. 使用和定价
  9. 测试
  10. 发展
  11. 释放
  12. 许可证

pi- 音频

语音约束 毕:语音相通,文字相通和实时语音相通,以pi自有风格. 用于 pi-coding- 代理插件和 塑料剂。 。 。 .

npm install @ai-ecoverse/pi-audio

一个用于节点24和较新的TypeScript ES模块库,以及浏览器.

端点需求用于
@earendil-works/pi-ai对所有的东西
@earendil-works/pi-durable选项./durable
node-web-audio-api 或者说 web-audio-api选项节点音频输出( N)openNodeAudio(中文(简体) )
@ai-ecoverse/wasm-webrtc-audio-processing选项./webrtc-aec

跟经纪人谈的三种方式

  • 声入人心. 供养者为耳口;皮剂为脑. 语音变成 UserMessage,代理运行一个正常的转弯, 并且只有它的最后一个答案是说话。 使用任何语音对文本和TTS适配器。 见 voiceTurns。 。 。 .
  • 实时. 一个语音对语音模型(OpenAI Realtime,xAI Voice,双子座活语)将对话作为 说话者派探员是 思想家 在一个工具后面, ask_agent。见 connectRealtime 财务报告和审定财务报表 bindThinker。 。 。 .
  • 主办级联. 11Labs代理商和Fish音频代理商在自己的服务器上运行语音对文本,一个LLM和TTS,并插入同一个实时会话和谈话者/思维者绑定. 他们的谈话者LLM可以是卖家模型或 CustomLlm: 任何OpenAI相容的端点,与pi自己的模型字段相描述(baseUrl, (中文(简体) ), id, (中文(简体) ), api, (中文(简体) ), headers) (中文(简体) ).

模型和适配器

翻译、演讲和实时模型都加入Pi-ai的 ModelTypeMap 通过声明合并。 他们不是聊天模式,所以Pi's Models.getAllModels() 没有列出他们。 pi-audio保留自己的目录: registerVoiceModel, (中文(简体) ), getVoiceModel(type, provider, id) 财务报告和审定财务报表 listVoiceModels。 。 。 . resolveVoiceAuth(models, voiceModel) 重新使用证书 pi 已经为供应商存储.

每个适配器都是它自己的子路径,在调用它之前什么也没有登记 register* 函数,该函数返回未注册的函数.

子路径登记册提供
./openairegisterOpenAIOpenAI和OpenRouter 转录(批发和流传)和演讲
./xairegisterXAI, (中文(简体) ), registerXaiRealtimexAI 语音对文本和 TTS( 批量和流线); xAI 语音实时
./elevenlabsregisterElevenLabs复制文本(批次和实时),字符对齐的 TTS
./mistralregisterMistralVoxtral 转录(批和实时),Voxtral TTS
./fishregisterFish语音记录和TTS
./googleregisterGoogle双子座TTS
./cloudflareregisterCloudflare工人 AI: Deepgram Flux, Nova-3和Aura, Whisper, MeloTTS
./wavespeedregisterWaveSpeedBatch Whisper和MiniMax的演讲(不是现场语音)
./openai-realtimeregisterOpenAIRealtimegpt-realtime-2, (中文(简体) ), gpt-realtime-2.1
./gemini-liveregisterGeminiLive双子座直播( E)gemini-3.8-live (a/conf.96/11,第5段)
./elevenlabs-agentsregisterElevenLabsAgents11Labs代理级, provisionAgent, (中文(简体) ), elevenLabsCustomLlm
./fish-agentsregisterFishAgents鱼类音频代理级联(通过LiveKit的WebRTC), provisionAgent, (中文(简体) ), fishCustomLlm
./brain—— 说chatCompletionsBrain后置 pi 代理服务器 CustomLlm 網址
./durable—— 说appendVoiceTruncate 用于可持久主机
./webrtc-aec—— 说WebRTC AEC3 回声取消器 echo.mode: "wasm"
./workletregisterAudioConvertWorklet音频工作文件夹中的格式转换
./fauxregisterFaux*用于测试的脚本、语音和实时适配器

模型能力是模型上的字段: streaming, (中文(简体) ), turnDetection (单位:千美元)none, (中文(简体) ), vad 或者说 semantic, (中文(简体) ), textStreaming, (中文(简体) ), inputFormats 编号 : outputFormats 财务报告和审定财务报表 voices,用于实时模型 toolCalls (单位:千美元)blocking 或者说 async, (中文(简体) ), delivery, (中文(简体) ), truncation 财务报告和审定财务报表 transports。读取这些旗帜而不是检查提供者名称。 价格是每个模型的 audioCost。 。 。 .

语音对文本和 TTS

import { getVoiceModel, speak, transcribe } from '@ai-ecoverse/pi-audio';
import { registerOpenAI } from '@ai-ecoverse/pi-audio/openai';

registerOpenAI();
const ears = getVoiceModel('transcription', 'openai', 'gpt-4o-transcribe');
const mouth = getVoiceModel('speech', 'openai', 'gpt-4o-mini-tts');

const heard = await transcribe(ears, { data: wavBytes, mimeType: 'audio/wav' }, { apiKey });
for await (const event of speak(mouth, { text: heard.text, voice: 'alloy' }, { apiKey })) {
  if (event.type === 'audio') play(event.chunk);
}
  • transcribe 是批量的. listen(model, audio) 溪流 speech_start, (中文(简体) ), partial, (中文(简体) ), final 财务报告和审定财务报表 turn_end 事件,一个 turn_end 每个用户转弯。 当一个模型没有 自己的转弯检测, listen 结尾随局部语音活性检测而转向.
  • speak 取一个字符串或一个 AsyncIterable<string>,所以语音可以从代理的第一句开始. 当一个模型无法接收流出文本时, speak 每句发送一个请求.
  • 音频是二进制 AudioChunks (单位:千美元)Uint8Array 加一个 AudioFormat) (中文(简体) ). convertAudio 财务报告和审定财务报表 convertAudioSource 转换为PCM16,浮32,G.711 μ-law和A-law,通道计数,样本率和PCM16 WAV. Opus,MP3和FLAC仅在不需要转换时通过.

声音转动

import { listen, speak, voiceTurns } from '@ai-ecoverse/pi-audio';

const options = { ears, mouth, voice: 'alloy', bargeIn: 'onWords' };
const session = voiceTurns({ listen, speak }, conversation, mic, out, options, signal);
for await (const caption of session.captions) render(caption);

主机执行 VoiceConversation数字 : prompt(message, meta, signal) 运行一个 pi 转弯并生成 pi-可持久形状的代理事件,以及 truncate(cut) 记录了一个驳船.

  • 口语文字. 只讲最后的答案。 思考、评论和工具呼吁保持沉默,除非 announce(call) 返回短行.
  • 贝吉入. 模式为 interrupt, (中文(简体) ), onWords (仅在转写后返回单词), ignore 财务报告和审定财务报表 auto (随回声校正. 中断会中止转弯和演讲,然后将回复切换到用户听到的. 和Pi -Duble, 一起, appendVoiceTruncate 从 ./durable 附录a voice.truncate 条目,其上下文编辑以已听到的文本取代助理消息并保留其工具调用。 所储存的条目没有变化,因此UI仍然有完整的回复.
  • 说明. session.captions 溪流 user_partial 编号 : user_final, (中文(简体) ), agent_generated (声入人心), agent_spoken (按实际播放,TTS返回对齐时每个字符)和 agent_cut。 。 。 . captionsFromHistory(entries) 重新装入后重建它们.
  • 声景. 过 soundscape 还有一个 AudioOut (一出输出上被口音和床相混合)在思考和工具暂停时播放音乐,气氛或滴答. followBed 等待时间 graceMs 在开始循环之前,保持它横跨有链条的工具呼叫,在语音和用户交谈时将其遮住. session.phases 揭露了UI的相同听觉,思维,工具和发言状态.

实时

import {
  askAgent,
  bindThinker,
  connectRealtime,
  getVoiceModel,
  mintRealtimeToken,
} from '@ai-ecoverse/pi-audio';
import { registerOpenAIRealtime } from '@ai-ecoverse/pi-audio/openai-realtime';

registerOpenAIRealtime();
const model = getVoiceModel('realtime', 'openai', 'gpt-realtime-2');
const context = { instructions, tools: [askAgent, readTool], voice: 'marin' };
const token = await mintRealtimeToken(model, context, { apiKey });
const session = await connectRealtime(model, context, { token });
await bindThinker(session, thinker, runDirectTool, {
  progress: 'silent',
  result: 'when_idle',
  ack: 'On it.',
  directTimeoutMs: 3000,
  directMaxChars: 4000,
});
  • 说客工具. 说话的人得到 ask_agent 财务报告和审定财务报表 read (单位:千美元)talkerTools) (中文(简体) ). 主机执行 Thinker,则运行在后面 ask_agent,直接 read 工具.
  • 送货. 将文字推入活语音使用一个词汇: interrupt, (中文(简体) ), when_idle 或者说 silent双子座 Live 将它本土化地映射到其工具列表中. 关于封堵模型(OpenAI, xAI, 双子座 3.1 Flash Live), bindThinker 承认 ask_agent 立即输入结果.
  • 断取. 登船时, interrupt({ itemId, heardMs }) 将提供者的上下文切入所听到的内容: conversation.item.truncate 在OpenAI和xAI上进行. 双子座没有短线呼叫.
  • 浏览器 auth. mintRealtimeToken 运行 API 密钥的住址并返回短寿命 { value, expiresAt, model, url? }覆盖 OpenAI 和 xAI 客户端秘密、 双子受限验证符、 11Labs 签名 URL 和 Fish LiveKit 会话.
  • Cloudflare AI Gateway. (原始内容存档于2018-09-29). 过 gateway 改为 connectRealtime 通过网关运行同一协议.
  • 会议. 双子座直播重新连接 goAway 并使用滑动窗口上下文压缩. RealtimeLedger 每个会话的米数,和 close() 返回其定价使用.

回声取消

背景床,和说话者自己的声音,漏入麦克风并引起假驳船入内. EchoControl 决定取消地点 :

  • browser数字 : getUserMedia({ echoCancellation: true }),通过本地的WebRTC回放回放,所以Chrome使用回放作为回放参考.
  • wasm: 已注射 EchoCanceller 由麦克风和 AudioOut.reference。 。 。 . ./webrtc-aec 提供基于 WebRTC AEC3 的: createWebRtcEcho({ wasm, sampleRate }) 用于您编译的模块(在音频工作室工作),以及 createNodeWebRtcEcho({ sampleRate }) 在节点上.
  • none:用于耳机.

calibrateEcho(out, mic, probe, durationMs, signal, canceller?) 进行探测 测量延迟和剩余泄漏 interrupt, (中文(简体) ), onWords 或者说 headphones。给予它至少3秒:AEC3在一秒内去除出漏出,但其报告的取消只在大约3秒的音频后才解决.

节点

openNodeAudio({ sink: 'none' }) 打开一个 AudioContext 在节点上 node-web-audio-api,或纯JS web-audio-api 作为倒计时器,在没有音频设备的机器上工作. openMixer(context) 在您已有的上下文上建立同样的演讲和床位图 。 在节点上:

  • 回声模式是 wasm 或者说 none,而回放是普通的Web Audio(没有WebRTC回放);
  • 主机提供麦克风作为 AudioSource· ;
  • pi -audio的活体释放出来 bindWorkletNode,因为返回 false 不停止处理器进入 node-web-audio-api。 。 。 .

使用和定价

一个语音呼叫报告 Pi -ai Usage 带有可选 audio 字段 (inputSeconds, (中文(简体) ), outputSeconds, (中文(简体) ), characters, (中文(简体) ), textMessages) (中文(简体) ). 托肯计数器保持0,美元成本进入现有的 cost 字段,从模型中计价 audioCost 以 priceAudio。 。 。 .

长相 addUsage 合并一个固定的字段列表并减少 audio。一个主机通过 pi-可扩展补丁汇总语音使用量,也可以调用 addAudioCounters数字 :

if (usage.reasoning !== undefined) total.reasoning = (total.reasoning ?? 0) + usage.reasoning;
addAudioCounters(total, usage);

pi -adio不应用该补丁本身。 诸如斯莱克特工之类的主机在他们的 patches/patches.json。 。 。 .

测试

@ai-ecoverse/pi-audio/faux 注册脚本适配器 : registerFauxTranscription, (中文(简体) ), registerFauxSpeech 财务报告和审定财务报表 registerFauxRealtime每个返回 { model, unregister, calls, … },因此测试可以脚本事件并检查发送的内容. 使用一个独特的 api 每个测试和呼叫 unregister()。导入 ./faux 没有注册,根包不会导入它.

发展

npm ci
npm run lint
npm test
  • npm run lint 运行 斯克林特语name: Biome,类型检查,无评论规则,没有单位测试用git,以及AGENTS.md限制. 左勾拳在每次犯案前都会进行同样的检查.
  • npm test 正在建设 dist/ 并运行整合测试 test/integration/。测试从不调用真实的语音或 LLM 提供者;适配器使用记录的固定装置进行测试.
  • 单位测试现场直播 test/unit/ 运行 npm run test:unit。 。 。 .

释放

CI是一个工作流程, .github/workflows/ci.yml,该调用 塑料-共享网络管道: 在每一个事件上都涂入了集成测试和Claude,以及在拉出请求时进行Codex审查,合并队列中再次进行集成测试. 每一次推动 main 然后运行语义发布,读取常规承诺消息,标记版本,通过信任的出版(OIDC)发布到npm ci.yml写着GitHub版 没有从分支或膝上型电脑上发布任何信息.

许可证

阿帕奇 - 2.0

版本与发布记录

@ai-ecoverse/pi-audio 共发布 37 个版本,首次发布于 2026/10/16;过去 12 个月发布了 37 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.27.5latest2026/10/308 天前
1.27.42026/10/2910 天前
1.27.32026/10/2315 天前
1.27.22026/10/1721 天前
1.27.12026/10/1721 天前
1.27.02026/10/1622 天前

关于 @ai-ecoverse/pi-audio 的常见问题

@ai-ecoverse/pi-audio 是什么?

Pi 语音绑定: pi-coding- agent 插件和 slic- agent 的语音对文本,文本对语音和实时语音

如何安装 @ai-ecoverse/pi-audio?

在项目目录运行 npm install @ai-ecoverse/pi-audio,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@earendil-works/pi-ai(>=1.3.0 <2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@ai-ecoverse/pi-audio 支持 TypeScript 吗?

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

@ai-ecoverse/pi-audio 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@ai-ecoverse/pi-audio 需要什么版本的 Node.js?

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

@ai-ecoverse/pi-audio 可以商用吗?

@ai-ecoverse/pi-audio 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@ai-ecoverse/pi-audio 的下载量有多少?

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

@ai-ecoverse/pi-audio 还在维护吗?

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