Files
AskaEth 4a2d276881
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled
feat(capability): 转码能力包(vendor 纯 Go AMR-NB 解码器 + 黄金向量逐样本对照 + 8 哨兵 + 注册面)
2026-10-05 13:02:28 +08:00

3.1 KiB
Raw Permalink Blame History

vendored: github.com/VoiceBlender/goamr-nb v1.0.0(AMR-NB 编解码器)

本目录是第三方源码的 vendored 拷贝,不是本项目自研代码。合规要务:随源码保留 了上游的 LICENSE(Apache-2.0)与 NOTICE(Apache-2.0 第 4 条要求),不得删除。

出处(可复现)

项 值
仓库 https://github.com/VoiceBlender/goamr-nb
版本 v1.0.0(tag)
上游提交 635f7966829a0e5d01030355e36aa6792352c57e
上游发布时间 2026-06-14T17:25:04Z(模块代理 .info)
取得方式 模块代理 https://goproxy.cn/github.com/%21voice%21blender/goamr-nb/@v/v1.0.0.zip(sha256 663140d606646d62d6660e8ff8930725826680b4373055e6aeeab55f858f6067)
许可证 Apache-2.0(LICENSE + NOTICE 均逐字保留)
上游依赖 仅 golang.org/x/sys(simd_amd64.go 用 x/sys/cpu 判 AVX2);本仓库 go.mod 已有 golang.org/x/sys v0.47.0,未新增任何模块依赖

为什么是「拷进仓库」而不是 require

上游是 2026-06 新建、1 个提交 / 1 个 tag / 2 star 的仓库。当外部依赖用等于把 构建押在一个随时可能消失的仓库上;而 AMR-NB 是冻结编解码(1999 定标), 拷进来基本不需要维护。因此:go.mod 不加 require,源码在本目录内自持。

拷了什么 / 没拷什么

  • 拷了:上游全部 57 个非测试 .go 文件 + LICENSE + NOTICE,逐字未改。
  • 没拷:上游 48 个 *_test.go(含 dsp_diff_test.go 这类需要外部 C 参考 harness 的测试)与 Makefile / README.md。本项目的正确性证据在 ../codec_amr_nb_test.go(ffmpeg/libopencore_amrnb 黄金向量),不依赖上游测试。
  • 本地新增:vendored_export.go(导出桥,见其文件头说明)与本文档。 除这两个文件外,本目录内容与上游一致。

已知能力边界(上游自述,实测确认;上游 README 的 bit-exact 说法不覆盖下列)

dsp_decoder.go:13 的注释写明:Cb_gain_average(增益平滑)与自适应相位色散 (phase dispersion)尚未移植;dsp.go:68 写明错误隐藏(bad frame)与 CNG (SID 舒适噪声)尚未移植。

实测结论(本项目 2026-10-05,fixture 见 ../testdata/): 坏帧 / SID / no-data 帧返回 160 样本静音(不报错、不做隐藏);好帧解码与 opencore-amrnb(ffmpeg libopencore_amrnb)逐字节不一致,样本级差值的量级见 ../codec_amr_nb_test.go 里记录的实测基线(SNR 约 16–21 dB,波形相关系数 ≥0.987, 长度/帧数/时长完全一致)。可听、可播、内容正确,但不是参考位精确实现。

另注:dsp.go 顶部的「DSP 目前是 STUBBED」注释已过期(上游未同步)—— dsp_decoder.go 里的解码 DSP 是完整实现,实测能解出真实语音。

交叉编译

纯 Go(CGO_ENABLED=0 可构建)。simd_amd64.s 是唯一非 Go 源文件, simd_noasm.go 提供 !amd64 的纯 Go 兜底 ⇒ GOOS=linux/darwin 交叉编译通过。