尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Vision Agents 的 AssemblyAI 流式语音识别插件:Universal-3 Pro 实时 STT 集成指南

Vision Agents 的 AssemblyAI 流式语音识别插件:Universal-3 Pro 实时 STT 集成指南 Vision Agents 的 AssemblyAI 流式语音识别插件Universal-3 Pro 实时 STT 集成指南【免费下载链接】Vision-AgentsOpen Vision Agents by Stream. Build voice and vision agents quickly with any model or video provider. Uses Streams edge network for ultra-low latency.项目地址: https://gitcode.com/GitHub_Trending/vi/Vision-AgentsAssemblyAI 插件位于 plugins/assemblyai/README.md为 Vision Agents 提供了基于 AssemblyAI Universal-3 Pro 模型的流式语音转写Streaming STT能力通过异步 WebSocket 将实时音频转成文本并原生支持基于标点的轮次检测、流式说话人分离与断线重连。读完本文你将掌握该插件的安装方式、全部配置参数的含义与取值约束并能基于源码级原理把它正确集成进自己的语音 Agent 管线中。插件定位与核心特性该插件是对vision_agents.core.stt.STT抽象基类的一个具体实现类名为assemblyai.STT其核心文件为 plugins/assemblyai/vision_agents/plugins/assemblyai/stt.py。与常见的 REST 批量转写不同它面向的是实时双向语音 Agent 场景官方文档宣称的实用能力包括实时流式转写基于异步 WebSocketwss://streaming.assemblyai.com/v3/ws持续上传音频、持续接收转写结果而非等待整段音频结束内置基于标点的轮次检测可通过min_turn_silence/max_turn_silence两个阈值微调“用户是否说完话”的判断时机流式说话人分离开启speaker_labels后可在混合音频流中实时区分说话人每个转写事件携带独立的participant标识原生SpeechStarted事件支持语音开始即触发TurnStarted让 Agent 能提前感知用户开口自定义提示词与关键词增强支持prompt与keyterms_prompt两种方式提升特定领域或专有名词的识别率内置断线重连采用带指数退避exponential backoff的有限次数自动重连避免短暂网络抖动导致会话中断。从源码结构看上述能力均可在 stt.py 中找到对应实现_build_ws_url负责组装 URL 参数_receive_loop/_send_loop负责双工收发_reconnect实现退避重连_handle_turn负责轮次消息到统一事件模型的转换。安装推荐使用uv添加依赖有两种等价方式# 方式一通过 vision-agents 的 extra 安装 uv add vision-agents[assemblyai] # 方式二直接安装独立插件包 uv add vision-agents-plugins-assemblyai插件包以vision-agents-plugins-assemblyai命名发布其元数据定义在 plugins/assemblyai/pyproject.toml要求requires-python 3.10运行时依赖为vision-agents与aiohttp当前 pyproject 中约束为aiohttp3.13.3README 中标注的下限为 3.9.0安装时以锁定的实际版本为准。快速开始基础用法最简用法只需指定模型与采样率两者均有合理默认值from vision_agents.plugins import assemblyai stt assemblyai.STT( speech_modelu3-rt-pro, # 默认模型 sample_rate16000, # 默认采样率 16kHz )插件默认使用u3-rt-proUniversal-3 Pro 的实时版本采样率默认为 16000 Hz。插件基类 agents-core/vision_agents/core/stt/stt.py 中定义的turn_detection标志默认为False而 AssemblyAI 插件将其覆写为True见 stt.py 第 30 行表明该 STT 自带轮次检测能力无需额外挂接独立的 turn detection 组件。在测试 test_assemblyai_stt.py 中test_default_configuration验证了默认配置_speech_model u3-rt-pro、_sample_rate 16000、turn_detection is True、provider_name assemblyai可作为默认行为的直接证据。流式说话人分离Streaming Diarization开启speaker_labels即可在多人混合音频中实时区分说话人stt assemblyai.STT( speaker_labelsTrue, max_speakers2, # 可选提示取值范围 1-10 )开启后每个Turn转写事件都会携带该说话人对应的独立participant同时原始标签可通过response.other[speaker_label]获取。其底层实现在_handle_turn与_resolve_participantstt.py当未开启说话人分离或消息中没有speaker_label时事件归属当前活跃的participant开启后插件会为每个speaker_label创建并缓存一个合成 Participantuser_id形如speaker_Aid形如speaker_A_session_id前8位同一个标签复用同一对象不同标签互不相同组装响应时response.other会被设置为{speaker_label: ...}方便上层消费原始标签。对应的测试用例覆盖了合成 Participant 的创建与缓存test_resolve_participant_creates_synthetic、test_resolve_participant_caches_synthetic、test_resolve_participant_distinct_per_label以及三人轮流对话时speaker_A/speaker_B/speaker_A的正确归属test_handle_turn_multi_speaker_conversation。需要注意参数校验max_speakers只能在speaker_labelsTrue时使用否则构造时会抛出ValueError(max_speakers requires speaker_labelsTrue)见 stt.py 第 70-71 行对应测试test_max_speakers_without_speaker_labels_raises。关键词增强Keyterms Boosting与自定义提示词对于品牌名、专有名词等冷僻词可通过关键词增强提升识别准确率stt assemblyai.STT( keyterms_prompt[AssemblyAI, Vision Agents], )或者使用更灵活的自定义转写提示词stt assemblyai.STT( promptThis is a conversation between two developers discussing SDKs., )约束prompt与keyterms_prompt二者互斥同时传入会抛出ValueError(prompt and keyterms_prompt cannot be used together)stt.py 第 67-68 行。测试test_prompt_and_keyterms_exclusive对此有专门验证。从_build_ws_url可以看出keyterms_prompt在发送前会经过json.dumps序列化而prompt直接作为 URL 查询参数传递。自定义轮次静音阈值Vision Agents 的轮次检测决定“何时判定用户说完话、交出话语权”。AssemblyAI 提供两个与 API 对齐的静音阈值参数stt assemblyai.STT( min_turn_silence100, # 触发推测性轮次结束检查前的静音毫秒数 max_turn_silence1200, # 超过此静音时长强制结束当前轮次 )min_turn_silence在该静音时长之前不做“可能已说完”的推测用于避免把短暂停顿误判为轮次结束max_turn_silence静音超过该上限后强制判定轮次结束防止冷场时长时间占用。两者默认值均为None即交给 AssemblyAI 服务端使用其 API 默认值传入时才会出现在 WebSocket URL 的查询参数中见_build_ws_url第 105-108 行。服务端按轮次返回结果时Turn消息中的end_of_turn标志是插件判断轮次归属的依据为True时以modefinal发射最终转写并附带TurnEnded事件否则以modereplacement发射增量/替换型中间结果stt.py 第 316-323 行。Transcript事件与TurnEnded/TurnStarted事件的定义分别位于 core/stt/stt.py 与 core/turn_detection/turn_detection.py。配置参数一览参数说明默认值api_keyAssemblyAI API 密钥未传入时回退读取ASSEMBLYAI_API_KEY环境变量Nonespeech_model使用的模型标识u3-rt-prosample_rate音频采样率Hz内部会将输入重采样到该值16000min_turn_silence推测性轮次结束检查前的静音时长毫秒API 默认max_turn_silence强制结束轮次前的最大静音时长毫秒API 默认prompt自定义转写提示词不可与keyterms_prompt同时使用Nonekeyterms_prompt待增强识别的关键词列表不可与prompt同时使用Nonespeaker_labels开启流式说话人分离支持多人识别Falsemax_speakers预期说话人数提示取值 1-10需speaker_labelsTrueNonemax_reconnect_attempts瞬时失败时的最大重连次数3reconnect_backoff_initial_s初始退避延迟秒0.5reconnect_backoff_max_s最大退避延迟秒4.0关于采样率的实现细节process_audio会先通过pcm_data.resample(self._sample_rate, 1)将任意输入采样率统一重采样为配置的sample_rate再进入发送队列stt.py 第 342-343 行因此上游设备哪怕以 48kHz 推流也能被正确处理——集成测试test_transcribe_mia_audio_48khz正是用 48kHz 的mia_audio_48khz分块喂入并断言最终转写包含 forgotten treasures。环境变量与密钥管理插件优先使用构造参数api_key未传时自动读取ASSEMBLYAI_API_KEY环境变量stt.py 第 73 行。推荐将密钥写入.env文件配合python-dotenv加载# .env ASSEMBLYAI_API_KEYyour_key_here完整示例 plugins/assemblyai/example/assemblyai_stt_example.py 展示了密钥的组织方式除ASSEMBLYAI_API_KEY外还依赖STREAM_API_KEY、STREAM_API_SECRETGetStream 边缘网络、GOOGLE_API_KEYGemini LLM与CARTESIA_API_KEYCartesia TTS并在入口处通过load_dotenv()统一加载。源码原理WebSocket 会话与消息处理连接建立与 URL 构建插件连接的目标为wss://streaming.assemblyai.com/v3/ws请求头携带Authorization: api_key与AssemblyAI-Version: 2025-05-12stt.py 第 17-18、134-138 行。_build_ws_url负责把配置项编码为查询参数sample_rate、speech_model必传min_turn_silence、max_turn_silence、prompt、keyterms_prompt按需传入speaker_labelstrue与max_speakers仅在开启分离时追加。测试test_build_ws_url_*系列对这几类 URL 组合做了精确断言。start()在建立连接后会等待_connection_ready事件最长 10 秒超时则抛出TimeoutError(Failed to connect to AssemblyAI within 10 seconds)第 119-128 行。音频分块与发送AssemblyAI 服务端要求每条消息 50-1000ms 的音频插件按100ms 的 int16 PCM分块chunk_size sample_rate * 2 // 1016kHz 下即 3200 字节。process_audio将重采样后的字节追加进_audio_buffer攒够一块就放入_audio_queue由独立的_send_loop任务以send_bytes异步写出实现发送与接收互不阻塞第 96-98、230-242、325-354 行。消息类型与轮次处理_receive_loop解析服务端下发的 JSON按type字段分发第 244-271 行消息类型处理动作Begin标记会话建立成功置位_connection_readyTurn进入_handle_turn按end_of_turn发射 final/replacement 转写SpeechStarted立即触发TurnStarted事件绑定当前 participantTermination记录日志本次会话处理的音频秒数含error字段记录流式错误日志转写事件以统一结构Transcript含text、mode、participant、response等字段推入基类的output流最终转写还会触发MetricsCollector.on_stt_transcript指标记录方便接入观测体系core/stt/stt.py 第 124-147 行。断线重连与指数退避当连接被关闭、正在关闭或出错时_receive_loop会转入_reconnect先清理旧连接与说话人缓存再以reconnect_backoff_initial_s起步、每次翻倍、封顶reconnect_backoff_max_s的退避策略重试最多max_reconnect_attempts次只有WSServerHandshakeError、TimeoutError、OSError这类瞬时故障才会触发重连重连成功即返回第 171-204 行。测试test_reconnect_defaults与test_custom_reconnect_config分别验证了默认值3 次 / 0.5s / 4.0s与自定义值5 次 / 1.0s / 8.0s的生效。close()会先冲刷残留音频缓冲、发送{type: Terminate}优雅终止消息再关闭 WebSocket 与 HTTP 会话确保资源彻底释放第 356-379 行。与完整 Agent 的集成示例插件不是孤立组件而是 Vision Agents 管线中stt插槽的一等公民。仓库示例 assemblyai_stt_example.py 展示了如何将它与其他插件拼装成一个可运行的语音 Agentfrom vision_agents.core import Agent, Runner, User from vision_agents.core.agents import AgentLauncher from vision_agents.plugins import assemblyai, cartesia, gemini, getstream async def create_agent(**kwargs) - Agent: agent Agent( edgegetstream.Edge(), # GetStream 边缘实时通信 agent_userUser(nameAssemblyAI Agent, idagent), instructionsYoure a helpful voice AI assistant. Keep replies short and conversational., sttassemblyai.STT(), # 本插件流式 STT ttscartesia.TTS(), # Cartesia 语音合成 llmgemini.LLM(), # Gemini 大模型 ) return agent示例还展示了以Runner(AgentLauncher(create_agent..., join_call...)).cli()启动 CLI、通过agent.join(call)加入通话、用agent.simple_response(...)播报开场白并agent.finish()收尾的完整生命周期。该示例的依赖声明见 plugins/assemblyai/example/pyproject.toml除 AssemblyAI 插件外还组合了getstream、gemini、vision-agents三个包。依赖与版本要求依赖说明aiohttp异步 WebSocket 客户端当前 pyproject 约束3.13.3vision-agents核心框架提供STT基类、Transcript/TranscriptResponse事件模型与指标/事件机制环境要求Python3.10运行时需可用的ASSEMBLYAI_API_KEY真实推流场景还需配合边缘传输如 GetStream与 LLM / TTS 插件才能构成完整闭环。测试验证插件质量由 plugins/assemblyai/tests/test_assemblyai_stt.py 中的 17 个测试用例保障覆盖真实集成转写test_transcribe_mia_audio_48khz标注pytest.mark.integration用 48kHz 音频分块喂入断言最终文本包含关键词且首条转写的 participant 归属正确参数互斥校验prompt与keyterms_prompt互斥、max_speakers依赖speaker_labels默认与自定义配置模型、采样率、重连参数、说话人分离开关的默认值及自定义值URL 构建各参数在 WebSocket URL 中的出现与缺失Participant 解析合成 Participant 的创建、缓存、去重与回退逻辑轮次事件发射final / replacement 两种模式、response.other中speaker_label的携带以及多人轮流对话的归属正确性。这些用例既是插件行为的契约也是二次开发时的参考样例。结语AssemblyAI 插件为 Vision Agents 提供了一条开箱即用的实时语音转写通道默认u3-rt-pro模型、100ms 音频分块、基于end_of_turn的轮次事件、流式说话人分离与有限次指数退避重连全部封装在单一assemblyai.STT类中。无论是构建客服机器人、会议纪要助手还是多说话人场景的语音应用都可以按照本文的配置表与源码分析快速落地并借助仓库内的测试与示例完成验证。【免费下载链接】Vision-AgentsOpen Vision Agents by Stream. Build voice and vision agents quickly with any model or video provider. Uses Streams edge network for ultra-low latency.项目地址: https://gitcode.com/GitHub_Trending/vi/Vision-Agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表