Skip to main content

API 参考

AaaS Pilot Kit 提供的完整 API 方法参考。

初始化方法

createAaaSPilotKit(options: IOptions): IAaaSPilotKitController

创建 AaaS Pilot Kit 控制器实例。

import {createAaaSPilotKit} from '@bdky/aaas-pilot-kit';

const controller = createAaaSPilotKit({
token: 'your-auth-token-here',
figureId: '209337',
ttsPer: 'LITE_audiobook_female_1',
// agentConfig: 若未提供自定义 agentService,此配置必填
agentConfig: {
token: 'xxxx',
robotId: 'xxxx'
}
});

实例方法(IAaaSPilotKitController)

mount($container?: HTMLElement): Promise<void>

🧩 挂载数字员工到指定 DOM 容器

行为:

  • 若传入 $container → 直接挂载
  • 若未传 → 调用 opts.getMountContainer()
  • 二者都没有 → 抛错 ❌

异步: 等待资源加载/容器初始化完成,同时获取 Microphone 麦克风权限。

参数:

  • $container - 可选,要挂载的 DOM 节点

抛出异常: 如果未传 $containeropts.getMountContainer 未定义

// 直接挂载到指定容器
await controller.mount(document.getElementById('avatar-container'));

// 或者不传参数,使用配置中的 getMountContainer
await controller.mount();

getOptions(): Required<IOptions>

📋 获取当前生效的完整配置(含默认值)。

用于调试、日志记录、动态配置比对。

返回: 合并默认值后的完整配置对象

const currentOptions = controller.getOptions();
console.log('当前配置:', currentOptions);

playFromFullText(fullText: string): IAaaSPilotKitController

🎬 【非流式】整段文本驱动播报 - 适合预生成回复、公告播报。

行为:

  • 立即开始 TTS 合成 + 数字人播报
  • 支持中途打断(若 interruptible=true

参数:

  • fullText - 要播报的完整文本

返回: this(支持链式调用)

controller.playFromFullText('欢迎使用AaaS Pilot Kit数字员工服务!');

playFromStreamText(chunk: string): IAaaSPilotKitController

🌊 【流式】分块文本驱动播报 - 适合大模型流式输出、实时对话。

行为:

  • 每次传入一个文本块(chunk),实时拼接并播报
  • 支持"首句切分"策略(见 opts.minSplitLen
  • 支持打断(若 interruptible=true

示例: 配合 SSE / WebSocket 流式接收 Agent 回复

参数:

  • chunk - 新增的文本片段

返回: this(支持链式调用)

// 模拟流式文本
controller.playFromStreamText('今天');
controller.playFromStreamText('天气');
controller.playFromStreamText('很好。');

playWaitFor(text: string, shouldStillPlay?: () => boolean): Promise<boolean>

等待当前播报完成后再播报新内容(排队模式)。

用于插播"重要通知"等场景。

行为:

  • 若正在播报 → 等待播完再播新内容
  • 若未播报 → 立即播放
  • 不触发打断逻辑(即使 interruptible=true
  • 可通过 shouldStillPlay 动态取消排队

参数:

  • text - 要播报的文本
  • shouldStillPlay - 可选,播报前检查是否仍需播放(返回 false 则取消)

返回: Promise<boolean> → true=已播放,false=被取消

const played = await controller.playWaitFor('系统通知:即将进行维护');
if (played) {
console.log('通知已播报');
}

mute(muted: boolean): IAaaSPilotKitController

🔇 静音控制 - 立即生效,不影响播报队列。

行为:

  • muted=true → 停止音频输出(画面口型仍同步)
  • muted=false → 恢复音频
  • 触发 emitter 'mute' 事件

参数:

  • muted - 是否静音

返回: this(支持链式调用)

// 静音
controller.mute(true);

// 取消静音
controller.mute(false);

interrupt(reason?: string): IAaaSPilotKitController

🛑 手动打断当前对话流程

行为:

  • 停止音频采集
  • 取消 Agent 请求
  • 中断数字人播报
  • 触发 'interrupt' 事件

通常由用户点击"打断按钮"或语音激活触发。

参数:

  • reason - 可选,打断原因(用于日志/埋点)

返回: this(支持链式调用)

// 用户点击打断按钮
controller.interrupt('用户手动打断');

dispose(): IAaaSPilotKitController

🗑️ 销毁实例 - 释放所有资源(RTC、音频、渲染、事件监听)。

⚠️ 调用后,此实例不可再使用!需重新调用 createAaaSPilotKit 执行创建

返回: this(支持链式调用,但之后方法调用会报错)

// 组件卸载时清理资源
controller.dispose();

input(text: string): IAaaSPilotKitController

💬 手动输入文本(模拟用户语音输入)→ 触发完整对话流程。

行为:

  • 跳过 ASR,直接将文本送入 Agent
  • 后续流程与语音输入完全一致(Agent → TTS → 播报)

适用场景: 调试、无障碍输入、聊天框集成

参数:

  • text - 用户输入的文本

返回: this(支持链式调用)

// 模拟用户输入
controller.input('我想了解产品功能');

setInterruptible(interruptible: boolean): IAaaSPilotKitController

🔄 动态切换"是否允许打断" - 可在对话中随时调整,立即生效。

参数:

  • interruptible - 是否允许打断

返回: this(支持链式调用)

// 重要播报时禁止打断
controller.setInterruptible(false);
controller.playFromFullText('重要通知:系统将在5分钟后维护');

// 播报完成后恢复打断功能
controller.setInterruptible(true);

checkNeedsManualActivation(): boolean

🚦 检测是否需要"手动激活"(如浏览器策略阻止自动播放)。

返回 true 时,必须调用 activateManually() 用户交互后才能播放音频。

常见于移动端/静音浏览器首次播放。

返回: boolean - 是否需要手动激活

if (controller.checkNeedsManualActivation()) {
showActivationButton();
}

activateManually(): Promise<void>

手动激活音频上下文(解决浏览器自动播放策略限制)。

🔹 必须在用户手势事件(click/touch)中调用!

例如:用户点击"开始对话"按钮时调用。

异步: 等待数字员工形象视频流、音频流上下文恢复成功。

抛出异常: 如果不在用户手势中调用,可能激活失败

// 在用户点击事件中激活
activateButton.onclick = async () => {
try {
await controller.activateManually();
hideActivationButton();
console.log('音频已激活');
} catch (error) {
console.error('激活失败:', error);
}
};

checkAudioDevice(): Promise<void>

🎙️ 检测麦克风设备可用性 - 执行 4 层渐进式检测(API 支持 → HTTPS → 设备枚举 → 权限 → 流获取)。

方法签名: async checkAudioDevice(): Promise<void>

返回值:

使用场景:

  • 在用户点击"开始对话"前主动检测设备状态
  • 在 ASR 启动失败后进行诊断
  • 定期检查设备连接状态(例如用户插拔耳机时)

检测层级:

  1. API 支持检测 - 浏览器是否支持 MediaDevices API
  2. HTTPS 检测 - 是否在安全上下文(HTTPS 或 localhost)
  3. 设备枚举 - 是否能列出音频输入设备
  4. 权限检测 - 用户是否授予麦克风权限
  5. 流获取 - 是否能成功获取音频流

性能提示:

  • 首次检测耗时 ~100-500ms(主要是 getUserMedia
  • 5 秒内缓存结果,重复调用 <1ms(避免频繁权限弹窗)

示例代码:

// 基础用法:监听检测结果
controller.emitter.on('microphone_available', (result) => {
if (!result.available) {
// 显示友好的错误提示
alert(result.userMessage);
} else {
console.log('设备正常,找到', result.devices?.length, '个麦克风');
}
});

// 执行检测
await controller.checkAudioDevice();
// 在"开始对话"前主动检测
startButton.onclick = async () => {
// 先检测设备
await controller.checkAudioDevice();

// microphone_available 事件会在这里触发
// 如果设备不可用,事件监听器会显示错误提示
};

// 监听检测结果
controller.emitter.on('microphone_available', (result) => {
if (result.available) {
// 设备可用,允许继续操作
enableVoiceButton();
} else {
// 设备不可用,禁用语音功能
disableVoiceButton();
showToast(result.userMessage);
}
});
// 高级用法:根据错误类型提供具体解决方案
controller.emitter.on('microphone_available', (result) => {
if (!result.available) {
switch (result.error) {
case 'PERMISSION_DENIED':
showPermissionGuide();
break;
case 'HTTPS_REQUIRED':
showHTTPSWarning();
break;
case 'DEVICE_NOT_READABLE':
showDeviceBusyWarning();
break;
default:
alert(result.userMessage);
}
}
});

await controller.checkAudioDevice();

错误类型说明: 参见 FAQ - 错误代码表 中的 3100-3105 错误码

相关事件: microphone_available - 接收检测结果

相关配置: checkAudioDeviceBeforeStart - ASR 启动前自动检测

keepAlive(): IAaaSPilotKitController

🕰️ 重置会话超时计时器 - "我还在用,别退出!"

行为:

  • 重新从 0 开始计时 opts.timeoutSec
  • 延迟触发超时事件(inactivity)

适用场景: 用户正在浏览页面、打字、填表单时调用

返回: this(支持链式调用)

// 用户有活动时保持会话
document.addEventListener('mousedown', () => {
controller.keepAlive();
});

document.addEventListener('keydown', () => {
controller.keepAlive();
});

链式调用示例

// 支持链式调用
controller
.setInterruptible(false)
.playFromFullText('欢迎使用我们的服务')
.keepAlive();

异常处理

try {
await controller.mount(containerElement);
controller.playFromFullText('初始化成功');
}
catch (e) {
console.error('初始化失败:', e);
// 处理错误
}