ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

LocalAI Voice Activity Detection(VAD)实战指南:用 `/v1/vad` 接口切分任意音频中的语音片段

2026/9/10 9:35:47 拓冰建站 浏览量
LocalAI Voice Activity Detection(VAD)实战指南:用 `/v1/vad` 接口切分任意音频中的语音片段 LocalAI Voice Activity DetectionVAD实战指南用/v1/vad接口切分任意音频中的语音片段【免费下载链接】LocalAILocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required.项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAILocalAI 内置了基于 Silero VAD 为主线完整讲解请求/响应格式、模型配置、检测参数并结合仓库源码core/http/endpoints/localai/vad.go、backend/go/silero-vad/vad.go 等剖析其调用链帮助你在实时语音会话、音频预处理、转录分段等场景中直接落地这套能力。VAD 能做什么识别音频中的人声片段Voice Activity DetectionVAD用于在音频流中识别是否存在人声以及人声起止于何处。它是语音类应用的公共前置能力语音唤醒、自动打断、ASR 分段、说话人轮换turn detection等场景都需要先由 VAD 判断这段波形里有没有人在说话。在 LocalAI 中VAD 由独立的 gRPC 后端提供并通过统一 HTTP 层对外暴露。其完整处理链路结合源码可确认为HTTP 层接收 JSON 请求并解析为schema.VADRequest见 core/schema/localai.go定义于 core/http/endpoints/localai/vad.go调用 core/backend/vad.go 中的backend.VAD通过ModelLoader加载模型并获取全局后端插槽AcquireGlobalBackendSlot用于后端容量准入控制通过 gRPC 将音频送给后端进程调用 proto 中定义的rpc VAD(VADRequest) returns (VADResponse)服务方法见 backend/backend.proto、消息体定义于 backend/backend.proto独立的 Silero 后端进程内运行silero-vad-go检测器完成分段见 backend/go/silero-vad/vad.go结果回传后由 HTTP 层组装为 JSON 响应。除独立的silero-vad后端外audio.cpp 后端同样服务该端点并在其内置包中携带silero_vad与marblenet_vad两个检测资源配置为model: bundled:silero_vad加上family:silero_vad选项即可零下载直接使用详见下文模型配置小节。此外从 core/config/model_config.go 的能力白名单可见FLAG_VAD用例还覆盖sherpa-onnx后端以及开启vad_only选项的whisper模型说明同一套 VAD 服务接口可对接多种实现。API 规范端点、请求与响应端点与方法项值方法POST端点/v1/vad、/vad两个路由由同一 handler 服务见 core/http/routes/localai.go路由层还做了两件对多模型/分布式部署重要的事通过BuildFilteredFirstAvailableDefaultModel中间件在不传模型时会按FLAG_VAD用例自动选择第一个可用的 VAD 模型通过ExposeNodeHeader在响应头中暴露处理请求的节点信息便于排查分布式环境下的请求去向。Request 请求体请求体为 JSON字段如下参数类型必填说明modelstring是模型名称例如silero-vad需与 YAML 配置中的名称一致audiofloat32[]是音频采样数组必须为16kHz PCM float的单声道原始采样值audio字段的 Go 结构定义为Audio []float32见 core/schema/localai.go。注意后端在 backend/go/silero-vad/vad.go 的Load中以固定SampleRate: 16000初始化检测器因此输入采样率必须与 16kHz 匹配否则分段结果的绝对时间会失真。Response 响应体返回一个包含检测到的语音分段的 JSON 对象字段类型说明segmentsarray检测到的语音分段列表segments[].startfloat分段起始时间秒segments[].endfloat分段结束时间秒start/end单位为秒由后端把 Silero 检测器返回的SpeechStartAt/SpeechEndAt浮点时间直接透传而来见 backend/go/silero-vad/vad.goHTTP 层仅做[]proto.VADSegment到[]schema.VADSegment的结构映射见 core/backend/vad.go不引入额外的时间偏移。实战用法从音频文件到分段结果/v1/vad端点要求audio字段是 16kHz 单声道 PCM 的float32原始采样数组因此请求体通常由真实音频文件转换而来而不是手工键入。完整流程分两步。第一步用 ffmpeg 将任意音频转为 16kHz 单声道ffmpeg -i input.mp3 -ar 16000 -ac 1 -f wav speech.wav-ar 16000重采样到 16kHz、-ac 1降为单声道。若输入本身是多声道/高采样率音频而跳过这一步分段起止时间将不再对应真实秒数。第二步加载采样并 POST以下 Python 片段需要先安装依赖pip install soundfile numpy requests。import soundfile as sf import numpy as np import requests audio, sample_rate sf.read(speech.wav) if audio.ndim 1: audio audio.mean(axis1) # downmix to mono samples audio.astype(np.float32).tolist() response requests.post( http://localhost:8080/v1/vad, json{model: silero-vad, audio: samples}, ) print(response.json())其中localhost:8080是 LocalAI 服务默认监听地址可按实际部署修改。代码里先读取 wav、再在必要时对多声道取平均downmix最后转成 Pythonfloat列表序列化为 JSON 数组恰好对应协议要求的float32[]。示例响应{ segments: [ { start: 0.5, end: 2.3 }, { start: 3.1, end: 5.8 } ] }表示音频在0.5s–2.3s与3.1s–5.8s两段存在语音其余区域为静音或非语音。空结果segments: []表示整段音频未检出人声。模型配置两种接入方式方式一独立的 silero-vad 后端为 VAD 模型创建 YAML 配置文件放在模型配置目录或直接使用仓库测试中使用的类似配置例如 tests/e2e-aio/models/vad.yamlname: silero-vad backend: silero-vadname请求体中model字段填写的名称需与此一致backend指定为silero-vad该名称出现在 core/config/model_config.go 的后端名单中也是FLAG_VAD用例白名单允许的后端见 core/config/model_config.go。backend: silero-vad对应的后端服务会把模型文件Silero ONNX 模型加载进内存检测器。首次调用前需通过模型管理/下载流程准备好该模型文件——从core/gallery/importers/silero-vad.go这类导入器与仓库 gallery 索引gallery/index.yaml中的关联看LocalAI 的模型 gallery 支持直接安装 Silero VAD 资源。方式二audio.cpp 后端内置资源零下载audio.cpp 后端在其自带包内就携带了silero_vad与marblenet_vad两个 VAD 资源因此在 audio.cpp 后端下使用 VAD无需额外下载任何模型。典型配置name: silero-vad backend: audio-cpp model: bundled:silero_vad family: silero_vad其中model: bundled:silero_vad引用随包分发的内置资源family: silero_vad告诉后端按该家族的处理路径运行。这使 LocalAI 的 VAD 开箱即用——更多 audio.cpp 后端的通用能力可参考 docs/content/features/audio-cpp.md。同一套/v1/vad接口下两种后端可透明切换。检测参数Silero 后端的内部默认值Silero VAD 后端使用以下内部默认参数在 backend/go/silero-vad/vad.go 的speech.DetectorConfig中固化参数默认值含义采样率SampleRate16kHz检测器固定的输入采样率阈值Threshold0.5语音概率判定阈值越高越保守更少误报、可能漏检轻音最小静音时长MinSilenceDurationMs100ms语音概率低于阈值持续满此时长才判定为分段结束语音填充时长SpeechPadMs30ms在检测到的语音段前后各补 30ms避免切掉音节首尾结合检测器语义理解Silero 对每个时间窗给出语音概率高于Threshold判为语音当低于阈值持续超过MinSilenceDurationMs才截断当前分段每个返回分段再向外扩充SpeechPadMs。因此响应中的start通常早于实际发声、end晚于实际收声。这些值对 Silero 通用场景是较稳健的出厂设定若业务需要更灵敏/更严格的端点切分可通过模型配置或音频预处理链路做适配例如把采样窗口分块后拼接结果。错误响应与排障状态码说明400缺少或非法的model/audio字段或模型配置解析失败500VAD 处理期间的后端错误400 的具体来源可在 HTTP 层看到当请求体无法解析为schema.VADRequest、model为空、或按模型名取不到对应 ModelConfig 时handler 直接返回echo.ErrBadRequest见 core/http/endpoints/localai/vad.go即模型未配置/模型名与配置不符也会落入 400。500 则来自模型加载失败或 gRPC 后端检测出错如 backend/go/silero-vad/vad.go 中Reset/Detect返回的错误此时应检查后端日志确认是模型文件缺失、采样率不符还是音频数据异常。在更大流程中的位置VAD 在 LocalAI 中不是孤立功能。从 core/config/model_config.go 的实时会话配置项如 VAD 参与实时语音门控、与 STT/LLM/TTS 组成语音进、文本回管道以及 core/http/endpoints/openai 下 realtime 相关的 VAD 缓冲、语义 VAD 测试如 core/http/endpoints/openai/realtime_vad_buffer_test.go、realtime_semantic_vad_test.go可以看出端点式 VAD/v1/vad适合把语音片段位置交给上层自行消费而实时会话内部还存在基于 VAD 的说话人起止检测turn detection机制。如果你正准备构建先切段、后转录的离线音频管线最直接的做法是对每个由/v1/vad返回的[start, end]区间用 ffmpeg 截取子音频ffmpeg -ss start -to end -i speech.wav seg.wav再交给 LocalAI 的转录transcription端点逐个识别从而把长音频结构化拆解为带时间戳的句子列表——这也是 VAD 在该项目中最重要的落地组合之一。【免费下载链接】LocalAILocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required.项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考