# 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` 交叉编译通过。