語音開發這塊領域的術語確實很硬,因為它跨接了通訊協定和音訊工程。這篇文章把整個問題鏈拆解成白話文,帶你從根本理解:一個「聲音失真」的 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 辨識率

# 延伸閱讀