語音開發這塊領域的術語確實很硬,因為它跨接了通訊協定和音訊工程。這篇文章把整個問題鏈拆解成白話文,帶你從根本理解:一個「聲音失真」的 Bug 背後,藏了多少層細節。
# 1. 什麼是 SDP?(談合約)
SDP(Session Description Protocol,會話描述協定) 就像是兩支電話要接通前的「規格合約書」。
根據 RFC 4566 的定義,SDP 本身不傳輸任何媒體,它只負責在兩端之間協商:
- 支援哪些編碼格式(Codec)
- 使用哪個 IP/Port 接收音訊
- 取樣率、頻道數等媒體參數
實際流程依照 RFC 3264 定義的 Offer/Answer 模型:
手機(Offerer) FreeSWITCH(Answerer)
| |
| ── SDP Offer ────────> | 「我支援 PCMU(0) 和 PCMA(8)」
| |
| <── SDP Answer ─────── | 「好,我選 PCMU(0)」
| |
| ═══ 語音串流 (RTP) ══ | 雙方用同一個 Codec 通話
合約類比: 手機開出條件清單,後端選一個接受,通話才正式開始。
# 2. PCMU vs. PCMA:同家族,不同語言
PCMU 和 PCMA 都是 G.711 標準的成員(ITU-T Recommendation G.711),但編碼演算法完全不同:
| PCMU(μ-law) | PCMA(A-law) | |
|---|---|---|
| SDP Payload Type | 0 |
8 |
| 主要使用地區 | 北美、日本、台灣 | 歐洲、部分亞洲 |
| 壓縮曲線 | μ-law 對數壓縮 | A-law 對數壓縮 |
| 取樣率 | 8000 Hz | 8000 Hz |
| 位元深度 | 8-bit | 8-bit |
兩者的 壓縮轉換表(量化映射)完全不同。同樣一個 8-bit 數值,用 μ-law 解出來是 A,用 A-law 解出來是 B——差異可以高達幾倍的振幅。
# 3. 實戰:一個 Bug 的解剖
# 根本原因:Codec Mismatch(編碼不匹配)
SDP 提供: PCMU (0) + PCMA (8)
手機選擇: PCMA(A-law)
後端解碼: 永遠用 μ-law 硬解
結果: A-law 資料被當成 μ-law 解 → 完全錯誤的 PCM → 機器雜音 / 爆音
這就像把德文稿子交給只看英文的翻譯機——讀出來的「意思」完全亂掉。映射錯誤導致波形振幅異常噴發,聽起來就是刺耳的雜音加上音量爆炸。
# 修復方式:強制 SDP 只提供 PCMU
在 answer_service.go 修改 SDP 回應,只列出 PCMU:
// Before(提供兩種 Codec,讓對方選)
m=audio 10000 RTP/AVP 0 8
// After(只提供 PCMU,對方沒得選)
m=audio 10000 RTP/AVP 0
手機端收到 Answer 後,只能用 PCMU 發送。後端解碼對了,聲音立刻清晰。
# 4. 振幅(Amplitude)與聲音大小
修好之後你可能會發現:聲音變小了。
這其實是「正常」。之前的「大聲」是解碼錯誤造成的異常振幅(雜訊);現在的 PCMU 正確解碼後,原始語音的振幅才是它本來的大小。
振幅(Amplitude): 音訊波形的高度,直接對應聲音大小。高度越高,能量越強,聲音越大。
# 5. Gain 與 AudioProcessor:給 AI 裝擴大機
ASR(自動語音辨識)就像人耳,聲音太小會聽不清楚,辨識準確率會下降。
解法:在輸入 ASR 前加一層音訊處理元件 VolumeAdjustedAudioProcessor,對每個音訊 frame 做增益放大:
輸入音訊 → VolumeAdjustedAudioProcessor (gain: 3.0) → ASR Engine
└─ 每個 sample × 3.0 → 振幅放大 3 倍
Gain(增益) 就是那個倍數:
1.0= 原始音量(不變)2.0= 音量翻倍3.0 ~ 4.0= 進一步放大,提升 ASR 辨識率
⚠️ Gain 不能無限調高,過大會讓波形「削頂(clipping)」,反而產生新的失真。
# 6. 整理:你解決了什麼
| 名詞 | 白話解釋 | 結果 |
|---|---|---|
| SDP | 通話前的規格合約 | 已修正,強制統一 PCMU |
| PCMU | G.711 μ-law,北美/台灣標準編碼 | 現在唯一使用的 Codec |
| Codec Mismatch | 說不同語言導致的解碼錯誤 | 已解決,根本原因修除 |
| 失真 / 爆音 | 解碼錯誤造成的波形異常 | 已消除 |
| Gain | 音量放大倍率 | 從 2.0 調高,提升 ASR 辨識率 |