语音转录
记录 Discord 语音频道中说的话,并将其转换为转录文本和会议笔记。
捕获语音转录¶
voice.autoJoin 控制在线状态和对话;它不会启动持久化录音。请显式使用 transcripts 代理工具开始捕获,或配置现有的 transcripts.autoStart 源。有关配置和检查命令,请参阅 Transcripts CLI。
已授权的代理可以使用以下方式开始捕获:
{
"action": "start",
"providerId": "discord-voice",
"accountId": "work",
"guildId": "123456789012345678",
"channelId": "234567890123456789"
}
捕获会订阅该确切账户、服务器和频道,直到停止。它会附加到现有的匹配语音连接,而不更改对话或占用所有权。当它与账户配置的 voice.autoJoin 目标匹配时,无论哪个先启动,正常语音对话都会保持启用。在 voice.autoJoin[].whenOccupied: true 下,连续捕获会等待空房间,并在下一次正常加入时恢复。它还会跟随同频道连接恢复以及同一账户语音管理器的替换。捕获永远不会将现有连接移动到另一个频道。
已授权的捕获独立于命令访问权限,记录所选房间中的参与者。服务器/频道用户和角色、commands.ownerAllowFrom 以及唤醒名称门控仍然控制对话、代理工具和活动运行控制;录音不会授予其中任何权限。受保护播放期间的语音会被记录,而不会中断播放或触发回复。如果 OpenClaw 首先订阅到已经在说话的人,它会记录可用的语音,而不进行对话输入或命令。正常对话需要在当前流结束后有一个新的接收流;在 voice.captureSilenceGraceMs 内的短暂暂停会保留当前流及其仅录音行为。
完整录音覆盖需要批量音频理解。录音使用每位说话人一个音频流和批量转录,并带有接收者的用户 ID、独立解析的显示标签和音频进入时间。已授权的说话者也可以从同一解码音频中提供实时对话。当所有实时说话者连接都繁忙时,录音仍会继续。这会对实时语音产生额外的批量转录成本,但使持久化录音独立于实时提供商交付和对话授权。连续语音会被拆分为连续且有界的音频上传;这些是同一捕获会话内的片段,而不是单独的会议。在 stt-tts 模式下,已授权的对话共享该批量转录,并在语音正常结束前等待,然后再响应。
现有的仅实时设置可以在批量转录被禁用或没有批量后端可用时,从其活动的每位说话人连接中记录最终文本。此有限路径要求每个提交的音频包都属于同一活动捕获;它会等待所有批量工作完成,并且从不重复成功或静默的批量结果。混合捕获输入、失败或过大的音频以及提供商连续性重置都不能产生录音回退文本。它仅覆盖被允许进入实时对话的说话者,因此不提供独立的房间录音。/vc status 会显示覆盖警告,并引导操作员配置音频转录。在 tools.media.audio.enabled 设置为 false 时开始捕获,需要存在现有的活动实时对话;否则它会返回启用错误。待处理的实时最终结果限制为每个说话人连接 1 MiB 和 1,000 个条目。
对话授权和回复独立于录音运行。每个语音连接允许八个未完成的语音请求,每个请求最多有 1 MiB 已解码音频等待准入。批量请求最多保留 1 MiB 转录文本和 1,000 个片段。达到限制会丢弃整个语音请求并继续录音;请在待处理请求完成后再次说话,或使用更短的语句。 待处理的 Discord 录音工作在 Gateway 进程范围内上限为 128 个块和 64 MiB WAV 数据。如果转录或保存笔记无法跟上,受影响的接收流会停止,而捕获保持注册。此预算在语音重连后仍然有效;请等待待处理音频处理完成,然后再说话。 如果转录失败或遗漏输入(例如过大的上传)、某个块失去命令访问权限,或开始或停止捕获时丢弃了低于最短时长的未捕获片段,则成功的笔记仍会保存,但不完整的语句不会触发代理回复或活动运行控制。恢复的访问权限适用于后续语句,而不是缺失的块。允许完成但没有文本的转录,并且不会使语句无效。
在没有配置自动加入目标或该服务器中没有活动对话时,手动捕获会以仅转录模式静默加入。随后的 /vc join 会在该连接上启用正常对话。针对另一个频道的捕获保持注册,而不会接管已配置或活动的对话,包括当录音器重连等待在一个更新的对话加入之后时。
使用 transcripts 工具的 stop 动作和返回的 sessionId 停止。停止捕获在断开连接时也能工作,并且不会断开由对话拥有的连接。已接收的音频可以在同一捕获保持活动期间的连接过渡中完成录音。停止或替换会撤销待发布内容;旧音频不能进入新捕获。
为同一已注册源开始新捕获会转移订阅,而不会重新连接或重复目标验证,即使它处于休眠状态。连续捕获可以跨越多个房间占用,直到显式停止。对于自动会议边界,请使用下文所述的 transcripts.autoStart[].whenOccupied。摘要不会自动发布到 Discord。
会议记录¶
使用 discord-voice 转录提供商,仅在有人类存在时让笔记机器人留在语音频道中。如果没有会话式自动加入目标或活跃会话,捕获仅为监听,并且不会启动实时提供商。将捕获附加到现有会话会保留其所有权。
启用 Discord 语音,配置一个经过身份验证的语音转文本提供商,并添加一个由占用状态驱动的转录源:
{
channels: {
discord: {
voice: { enabled: true },
},
},
tools: {
media: {
models: [{ provider: "openai", model: "gpt-4o-transcribe", capabilities: ["audio"] }],
audio: { enabled: true },
},
},
transcripts: {
autoStart: [
{
providerId: "discord-voice",
guildId: "123456789012345678",
channelId: "234567890123456789",
whenOccupied: true,
},
],
},
}
机器人需要在目标频道中具有 Connect 权限,以及 GuildVoiceStates 意图,而 voice.enabled: true 默认会启用该意图。不要显式禁用 channels.discord.intents.voiceStates。将频道保留在任何已配置的 voice.allowedChannels 允许列表中。对于此笔记方案,请使用 transcripts.autoStart,而不是会话式 voice.autoJoin。在启用之前,告知参与者机器人会捕获并存储转录。
对于多个 Discord 账号,除非配置的默认账号能明确解析,否则添加 accountId 以选择启用语音的机器人。每个账号和每个 guild 最多配置一个由占用状态驱动的 discord-voice 条目;机器人无法捕获同一 guild 中的多个语音频道。后续冲突的条目会被跳过并发出警告。
机器人在人类到达时加入,包括启动时频道已有人占用的情况。最后一名人类离开后,它会等待 30 秒再离开并生成笔记;在该宽限期内返回会保持捕获继续运行。片段使用生成的会话 ID,忽略已配置的 sessionId。如果存储的来源确认了生成的 ID,则在 Gateway 重启或短暂中断后,同一来源在不到 10 分钟前停止的会话可以重新打开。它会保留其 ID、开始时间和已累积的发言。提供的 ID 以及来源未知的旧记录保持归档;捕获会重新开始,而不更改这些笔记。
笔记包括参与者、概述、决定、行动项和风险。
在捕获期间,当有新语音已保存时,笔记大约每五分钟更新一次。安静的房间不会触发重复摘要。停止捕获会排空已接收的语音并保存最终笔记。
它们使用代理的 utility 模型,如果模型生成失败,则回退到其主要模型,然后回退到确定性启发式笔记。使用 transcripts 工具、CLI 或 Control UI Meetings 页面读取已存储的笔记。该工具的 summarize 操作会从已存储的转录重新生成笔记。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw