ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

go2rtc 的 Wyoming 集成指南:用 Home Assistant 打造本地语音助手

go2rtc 的 Wyoming 集成指南:用 Home Assistant 打造本地语音助手 go2rtc 的 Wyoming 集成指南用 Home Assistant 打造本地语音助手【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc导读本文围绕 go2rtc 的 Wyoming 模块internal/wyoming/README.md展开讲解如何将 go2rtc 作为 Wyoming Satellite、Wyoming External Microphone / Sound 接入 Home Assistant 语音助手流水线覆盖典型语音链路、配置项listen/name/wake_uri/vad_threshold/mode/event、基于 expr 的事件脚本编程以及多种端侧部署示例。读完本文你将掌握用任意支持 PCM含 PCMA/PCMU的音频源与支持双向音频backchannel的播放源搭建本地语音助手并用脚本引擎自定义唤醒、TTS 播放等行为。注意该模块仍处于开发中官方文档声明格式尚不稳定The format is under development and does not yet work stably生产使用前请谨慎验证。Wyoming 是什么Wyoming 是 Home Assistant 生态中用于本地语音助手的通信协议Home Assistant 官方集成见wyoming集成页。go2rtc 通过 internal/wyoming/wyoming.go 注册wyoming://协议并启动 TCP 服务端使 go2rtc 能扮演以下角色Wyoming Satellite完整的卫星端把麦克风音频上送 Home Assistant并把 TTS 音频回放出来Wyoming External Microphone仅提供麦克风输入mode: micWyoming External Sound仅提供音频回放mode: snd任何支持 PCM 编解码含 PCMA/PCMU的音频源都可以作为音频输入MIC任何支持双向音频backchannel且使用 PCM 编解码的源都可以作为音频输出SND桌面/服务器上的麦克风和扬声器可通过 FFmpeg跨平台或 Linux 下的 ALSA 源接入行为可通过内置的脚本引擎expr自定义。典型语音助手流水线官方 README 给出的典型流水线为 7 个环节音频流MIC——任意支持 PCM含 PCMA/PCMU的音频源语音活动检测VAD唤醒词WAKE——如 OpenWakeWord语音转文字STT——如 Whisper、Vosk对话智能体INTENT——Home Assistant 的 conversation 集成文字转语音TTS——如 Google Translate、Piper音频流SND——任意支持双向音频backchannel且使用 PCM含 PCMA/PCMU的源。其中 WAKE/STT/INTENT/TTS 可以由 Home Assistant 聚合大量不同项目实现而 MIC/SND 则可以利用 go2rtc 丰富的音视频源技术栈。也就是说go2rtc 负责麦克风进、扬声器出这两端中间的大脑由 Home Assistant 流水线完成。配置详解在go2rtc.yaml的wyoming配置段下每个 key 对应一个已定义的 stream流名基本结构如下wyoming: stream_name_from_streams_section: listen: :10700 name: My Satellite # 可选显示名称缺省用 stream 名 wake_uri: tcp://192.168.1.23:10400 # 可选WAKE 服务地址 vad_threshold: 1 # 可选VAD 阈值0.1 ~ 3.5配置项说明配置项类型默认值说明listenstring无TCP 监听地址如:10700Home Assistant 据此连接namestringstream 名卫星名称会在 describe 响应中上报给 Home Assistantwake_uristring空WAKE唤醒词服务地址tcp://host:port可选vad_thresholdfloat320VAD 阈值0.1~3.5可选缺省为 0 时按有声即触发处理modestringsatellitemic表示仅麦克风、snd表示仅回放、缺省为完整卫星eventmap[string]string空事件 → expr 脚本映射用于自定义事件处理参数底层实现从 internal/wyoming/wyoming.go 可以看到配置解析结构其中VADThreshold在传给服务端时被放大 1000 倍int16(1000 * cfg.VADThreshold)即 1.0 → 1000。在 pkg/wyoming/satellite.go 的状态机中处于stateWaitVAD时若VADThreshold 0或s16le.PeaksRMS(chunk) VADThreshold则认为检测到语音注释还说明测试显示超过 1000 的取值大概率是语音——也就是说 1.0 是文档推荐的参考起点。VAD 的 RMS 计算实现在 pkg/pcm/s16le/s16le.go。关于 WAKE 的关键行为如果未配置wake_uri或无法连接 WAKE 服务go2rtc 会把所有音频直接转发给 Home Assistant此时唤醒词必须由 Home Assistant 侧的 Voice Assistant 流水线自己完成。若配置了wake_urigo2rtc 只有在检测到 VAD 语音后才开始向 WAKE 服务发送音频唤醒成功后触发后续流水线。关于音频格式的前提接入的 stream 必须能提供 PCM 音频含 PCMA/PCMU。go2rtc 会在 pkg/wyoming/satellite.go 中把接收到的任意音频轨道通过pcm.TranscodeHandler见 pkg/pcm/handlers.go统一转码为 16 kHz、单声道、16 位 PCMCodecPCML并按 20ms 一包2 * 16000 / 50重组后上送回放方向则按 22050 Hz 的 PCM 处理见 pkg/wyoming/snd.go。在 Home Assistant 中添加集成Home Assistant → 设置Settings→ 设备与服务Integrations→ 添加集成Add→Wyoming Protocol填写主机Host与端口Port即go2rtc.yaml中listen配置的地址连接后即可选择语音助手流水线。选择多个唤醒词默认情况下wake_uri未携带name参数时go2rtc 会请求名为ok_nabu_v0.1的默认唤醒词见 pkg/wyoming/wakeword.go。可以通过在 URL 中追加多个name参数一次订阅多个唤醒词wake_uri: tcp://192.168.1.23:10400?namealexa_v0.1namehey_jarvis_v0.1namehey_mycroft_v0.1namehey_rhasspy_v0.1nameok_nabu_v0.1pkg/wyoming/README.md 中列出了这些默认唤醒词alexa_v0.1、hey_jarvis_v0.1、hey_mycroft_v0.1、hey_rhasspy_v0.1、ok_nabu_v0.1并提供了更多唤醒词模型资源的链接wyoming-openwakeword、home-assistant-wakewords-collection、micro-wake-word-models 等。从源码看每个name参数会作为names列表通过detect事件下发给 WAKE 服务pkg/wyoming/wakeword.go唤醒成功后返回的detection事件会记录命中词名称并触发internal-detection事件pkg/wyoming/satellite.go。事件与脚本引擎go2rtc 允许用 expr 脚本引擎文档原链接为../expr/README.md即仓库内 internal/expr/README.md处理 Wyoming 事件。开启日志log.wyoming: trace可以观察实际发生的事件类型与数据。官方提供的默认脚本如下等价于 pkg/wyoming/expr.go 中handleEvent的默认行为wyoming: script_example: event: run-satellite: Detect() pause-satellite: Stop() voice-stopped: Pause() audio-stop: PlayAudio() WriteEvent(played) Detect() error: Detect() internal-run: WriteEvent(run-pipeline, {start_stage:wake,end_stage:tts}) Stream() internal-detection: WriteEvent(run-pipeline, {start_stage:asr,end_stage:tts}) Stream()脚本中可用的函数与变量Detect()—— 启动 VAD 与唤醒词检测流程对应 pkg/wyoming/expr.go内部把状态机置为stateWaitVADStream()—— 开始向客户端Home Assistant传输音频置为stateActiveStop()—— 停止并断开音频流但不断开客户端连接pkg/wyoming/expr.goPause()—— 暂停音频传输而不断开流置为stateIdlePlayAudio()—— 播放客户端Home Assistant最近一次发来的音频pkg/wyoming/expr.goWriteEvent(type, data)—— 向客户端Home Assistant发送事件Sleep(duration)—— 暂停脚本执行如Sleep(1.5s)pkg/wyoming/expr.goPlayFile(path)—— 播放wav文件的音频pkg/wyoming/expr.goType—— 事件类型名称Data—— 事件数据JSON 格式如{text:how are you}以及 expr 模块提供的其他函数如fetch、fromJSON、toJSON、string等。重要行为说明覆盖即接管如果你为某事件编写了脚本该事件的默认动作将不再执行需要自己补上必要的步骤两个额外事件internal-run——Detect()之后 VAD 检测到语音、但 WAKE 服务不可用时触发pkg/wyoming/satellite.gointernal-detection——Detect()之后唤醒词被检测到时触发pkg/wyoming/satellite.go同步执行PlayFile与PlayAudio是同步执行的后续步骤要等它们完成后才会继续。事件脚本示例示例 1唤醒词命中时播放提示音仅支持wavwyoming: script_example: event: internal-detection: PlayFile(/media/beep.wav) WriteEvent(run-pipeline, {start_stage:asr,end_stage:tts}) Stream()示例 2在 Home Assistant 媒体播放器上播放 TTS每个事件都带Type和 JSON 格式的Data可在脚本中取用在synthesizeTTS 开始步骤中读取text字段调用 HA 的 REST API 让指定媒体播放器发声在audio-stopTTS 结束步骤中读取 TTS 时长秒等待该时长后重新启动流水线。wyoming: script_example: event: synthesize: | let text fromJSON(Data).text; let token eyJhbGci...; fetch(http://localhost:8123/api/services/tts/speak, { method: POST, headers: {Authorization: Bearer token,Content-Type: application/json}, body: toJSON({ entity_id: tts.google_translate_com, media_player_entity_id: media_player.google_nest, message: text, language: en, }), }).ok audio-stop: | let timestamp fromJSON(Data).timestamp; let delay string(timestamp)s; Sleep(delay) WriteEvent(played) Detect()部署示例1. Windows 服务器上的卫星FFmpeg FFplay用 FFmpegdshow采集 Windows 麦克风用 FFplay 播放 22050 Hz 的 16 位 PCM 回放流-#backchannel1#audios16le/22050是 go2rtc 的双向音频语法streams: satellite_win: - exec:ffmpeg -hide_banner -f dshow -i audioMicrophone (High Definition Audio Device) -c pcm_s16le -ar 16000 -ac 1 -f wav - - exec:ffplay -hide_banner -nodisp -probesize 32 -f s16le -ar 22050 -#backchannel1#audios16le/22050 wyoming: satellite_win: listen: :10700 name: Windows Satellite wake_uri: tcp://192.168.1.23:10400 vad_threshold: 12. 支持双向音频的大华Dahua摄像头作为卫星摄像头自带的麦克风/扬声器经 RTSP 双向音频直接作为 MIC 与 SND无需额外声卡设备streams: dahua_camera: - rtsp://admin:password192.168.1.123/cam/realmonitor?channel1subtype1unicasttrueprotoOnvif wyoming: dahua_camera: listen: :10700 name: Dahua Satellite wake_uri: tcp://192.168.1.23:10400 vad_threshold: 13. 使用外部 Wyoming 麦克风与声音组件作为卫星由 wyoming-mic-external / wyoming-snd-external 提供音频go2rtc 聚合二者成为一个卫星streams: wyoming_external: - wyoming://192.168.1.23:10600 # wyoming-mic-external - wyoming://192.168.1.23:10601?backchannel1 # wyoming-snd-external wyoming: wyoming_external: listen: :10700 name: Wyoming Satellite wake_uri: tcp://192.168.1.23:10400 vad_threshold: 1作为 Wyoming External Microphone / Sound想单独使用 rhasspy 的 wyoming-satellite 项目的进阶用户可以让 go2rtc 只承担外部麦克风或外部声音角色。服务端根据mode参数分发到HandleMic/HandleSndinternal/wyoming/wyoming.go。go2rtc.yamlstreams: wyoming_mic_external: - exec:ffmpeg -hide_banner -f dshow -i audioMicrophone (High Definition Audio Device) -c pcm_s16le -ar 16000 -ac 1 -f wav - wyoming_snd_external: - exec:ffplay -hide_banner -nodisp -probesize 32 -f s16le -ar 22050 -#backchannel1#audios16le/22050 wyoming: wyoming_mic_external: listen: :10600 mode: mic wyoming_snd_external: listen: :10601 mode: snddocker-compose.yml运行 wyoming-satellite 并分别连接两个 go2rtc 端口version: 3.8 services: satellite: build: wyoming-satellite # https://github.com/rhasspy/wyoming-satellite ports: - 10700:10700 command: - --name - my satellite - --mic-uri - tcp://192.168.1.23:10600 - --snd-uri - tcp://192.168.1.23:10601 - --debug作为 Wyoming External Source反过来go2rtc 也能通过wyoming://协议把外部的 wyoming-mic-external / wyoming-snd-external 当作普通音视频源接入自己的 stream协议注册与backchannel1参数解析见 pkg/wyoming/wyoming.gobackchannel 模式实现见 pkg/wyoming/backchannel.go。go2rtc.yamlstreams: wyoming_external: - wyoming://192.168.1.23:10600 - wyoming://192.168.1.23:10601?backchannel1docker-compose.yml以 Docker 运行 mic 与 playback 两个外部组件并暴露端口version: 3.8 services: microphone: build: wyoming-mic-external # https://github.com/rhasspy/wyoming-mic-external ports: - 10600:10600 devices: - /dev/snd:/dev/snd group_add: - audio command: - --device - sysdefault - --debug playback: build: wyoming-snd-external # https://github.com/rhasspy/wyoming-snd-external ports: - 10601:10601 devices: - /dev/snd:/dev/snd group_add: - audio command: - --device - sysdefault - --debug调试开启 wyoming 模块的 trace 日志即可观察事件收发与脚本执行情况log: wyoming: trace在源码中服务端通过Trace/Error回调输出日志internal/wyoming/wyoming.go脚本执行时也会打印event... data... payload size...以及脚本求值结果或错误pkg/wyoming/expr.go方便排查事件类型与数据格式。协议与源码导读Wyoming 协议采用JSON 头 换行 可选数据/负载的帧格式头部含type、version、data_length、payload_length字段实现于 pkg/wyoming/api.go协议版本号Version 1.5.4。事件类型如describe、run-satellite、detect、audio-start、audio-chunk、audio-stop等在 pkg/wyoming/expr.go 中都有注释标明其 Home Assistant 侧语义。卫星状态机stateNew→stateIdle→stateWaitVAD→stateWaitWakeWord→stateActive见 pkg/wyoming/satellite.go是整个模块的核心VAD 过滤 → 唤醒词确认 → 音频上送 Home Assistant → 回放 TTS。有兴趣深入的朋友可以从 internal/wyoming/wyoming.go 的Init()入口、pkg/wyoming/satellite.go、pkg/wyoming/wakeword.go 三个文件开始阅读。【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表