LocalAI 声音事件分类实战/v1/audio/classification 端点与 ced 后端实现解析【免费下载链接】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声音事件分类Sound-event classification又称音频打标回答的问题是我在听到什么给定一段音频片段模型返回一组带分数的 AudioSet 标签例如Baby cry, infant cry、Glass breaking、Dog bark、Alarm。LocalAI 通过 OpenAI 风格的/v1/audio/classification端点暴露该能力参考后端为 ced.cppCED一个 527 类的 AudioSet 打标器一个跑在 log-mel 频谱图上的小型 ViT已移植到 ggml 并与 PyTorch 完全对齐。读完本文你将掌握该端点的完整请求/响应协议、模型安装与 curl 调用方式并能从源码层面理解 LocalAI 如何把一次 HTTP 音频上传拆解为 gRPC 后端调用。什么是声音事件分类与语音转文字说了什么不同声音分类关心的是声音本身的内容。输入一段任意格式的音频输出是一组候选事件标签及其置信度。由于同一时刻多种声音可以共存比如婴儿哭闹的同时伴随玻璃碎裂CED 采用的是多标签multi-label独立分类每个类别的概率相互独立因此所有分数加起来不必等于 1。LocalAI 将分类建模为一个常规的 OpenAI 风格端点与/v1/audio/transcriptions同构——任何 HTTP 客户端都可以直接调用消费端不需要任何 Python 依赖。端点POST /v1/audio/classification在 core/http/routes/openai.go 中可以看到该端点同时注册了两个路径POST /v1/audio/classification POST /audio/classification Content-Type: multipart/form-data请求字段字段类型说明filefile必填音频文件接受ffmpeg支持的任意格式modelstring必填支持声音分类的模型名例如ced-base-f16top_kint返回的标签数量0 使用后端默认值thresholdfloat丢弃得分低于该阈值的标签从源码看HTTP 层通过parseFormInt/parseFormFloat解析这两个可选参数默认值均为 0即不生效见 core/http/endpoints/openai/sound_classification.goreq : backend.SoundDetectionRequest{ TopK: int32(parseFormInt(c, top_k, 0)), Threshold: float32(parseFormFloat(c, threshold, 0)), }当top_k 0时ced 后端会回落到默认值 10见 backend/go/ced/goced.gotopK : req.GetTopK() if topK 0 { topK 10 // sensible default for a tagging response }响应格式{ model: ced-base-f16, detections: [ {index: 23, label: Baby cry, infant cry, score: 0.87}, {index: 22, label: Crying, sobbing, score: 0.41} ] }响应体由 core/schema/sound_classification.go 定义detections中每一项包含index模型本体论中的类别索引、label人类可读的 AudioSet 类名和score该类别的独立概率。检测结果是按分数降序返回的——后端先排序一次Go 侧在 core/backend/sound_classification.go 还会做一次稳定的二次排序以保证顺序sort.SliceStable(out.Detections, func(i, j int) bool { return out.Detections[i].Score out.Detections[j].Score })由于分数是多标签独立概率它们不要求加和为 1。实战安装模型并调用第一步从模型库gallery安装一个支持声音分类的模型下文示例使用ced-base-f16local-ai run ced-base-f16仓库中的 gallery/ced.yaml 给出了 ced 系列模型的标准配置模板name: ced-sound-classification config_file: | backend: ced known_usecases: - sound_classification其中known_usecases: sound_classification是端点路由的关键——/v1/audio/classification中间件会按FLAG_SOUND_CLASSIFICATION过滤出声明了该 usecase 的模型core/http/routes/openai.go因此自定义模型配置时必须保留这一声明。然后上传一段音频进行分类curl http://localhost:8080/v1/audio/classification \ -H Content-Type: multipart/form-data \ -F file/path/to/clip.wav \ -F modelced-base-f16 \ -F top_k10按需追加-F threshold0.2可以只保留置信度较高的标签减少噪声标签。源码走读一次分类请求的完整链路从源码结构看一次请求经历四层1. HTTP 端点层core/http/endpoints/openai/sound_classification.go。处理器接收 multipart 上传后将音频落盘到服务器自建的临时目录os.MkdirTemp(, sound-classification)请求结束后defer os.RemoveAll(dir)清理。代码注释明确说明了安全性考虑目标文件名由服务端生成的临时目录与上传文件名的path.Base拼接路径穿越风险已被排除。2. 后端调度层core/backend/sound_classification.go。SoundDetectionRequest携带音频路径与TopK、Threshold经toProto转换为 gRPC 的SoundDetectionRequest后发给后端。loadSoundDetectionModel会校验模型必须配置了后端if modelConfig.Backend { return nil, fmt.Errorf(sound classification: model %q has no backend set; supported backends include ced, modelConfig.Name) }3. gRPC 后端层backend/go/ced/main.go。ced 后端是一个由 LocalAI 内部启动的 gRPC 服务每个已加载模型对应一个实例。它通过purego动态加载libced.somacOS 下为libced.dylib并绑定ced_capi.h声明的整套 C APIced_capi_load、ced_capi_num_classes、ced_capi_sample_rate、ced_capi_classify_path_json、ced_capi_classify_pcm_json等。库路径可用环境变量CED_LIBRARY覆盖与PARAKEET_LIBRARY/WHISPER_LIBRARY的约定一致默认查找二进制同目录下的.so。4. C 引擎层backend/go/ced/goced.go。SoundDetection方法调用ced_capi_classify_path_json得到 JSON 格式的标签列表然后在 Go 侧应用threshold过滤score threshold的标签被丢弃最后按分数降序排序返回。由于 C 侧每个上下文是单线程的实现上用engineMu互斥锁串行化对引擎的访问。CED_LIBRARY、ced_capi_*函数名等细节均可在 backend/go/ced/main.go 的绑定表中逐一核对。ced 后端的构建与硬件加速backend/go/ced/Makefile 揭示了 ced 后端与上游 ced.cpp 的集成方式版本固定CED_VERSION锁定到具体的上游 commitCED_REPO指向localai-org/ced.cpp遵循 LocalAI 其他 C 后端parakeet-cpp、whisper.cpp的惯例静态自包含cmake 参数包含-DCED_SHAREDON -DCMAKE_POSITION_INDEPENDENT_CODEON并把 ggml 以 PIC 方式静态链入libced.so这样dlopen时不需要旁边再放一个libggml*.so纯 Go 侧零 CGOced-grpc目标以CGO_ENABLED0构建因为 C 交互全部走purego动态绑定而非 CGO 编译期链接可选加速后端通过BUILD_TYPE切换映射到 ced.cpp 的CED_GGML_*cmake 开关——cublasCUDA CUDA graphs、openblas、hipblasROCm、vulkan默认NATIVEfalse关闭 ggml native 以换取跨机器可移植性。CED 的权重为 Apache-2.0 许可可作为 GGUF 自由再分发模型加载时Load方法要求提供 GGUF 文件路径opts.ModelFile调用ced_capi_load打开 C API 上下文backend/go/ced/goced.go。相关功能音频转文字 —— 语音转文字transcription说话人分离 —— 谁在什么时候说话【免费下载链接】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),仅供参考