實時音影片質量評估方案

在路上發表於2020-08-14

原文見:在路上的部落格

全文參考:
1. 音影片測試建議(騰訊音影片實驗室質量平臺組)
2. Android 端音影片測試(網易雲信)
3. 騰訊會議如何進行影片質量評估與最佳化?
4. 關於 UGC、PGC、OGC 三者詳細區別
5. 音影片質量評估綠皮書
6. 語音質量評估
7. 語音增強及質量評估的論文
8. VIPKID 音影片質量評估與感知系統


恭喜自己,因為做該方案,完成了自己的第一次知名開源專案的 pull request。

1、背景

影片電話功能,涉及實時音影片的質量評估。

音影片傳輸流程如下:
音影片傳輸流程如下

如圖所示,影響音影片質量的因素有:

  • 源影片的採集質量(硬體決定);
  • 音影片 SDK 的服務質量(SDK 服務商決定);
  • 網路情況;

實時傳輸影片質量專項有:(不同網路環境下)

  • 效能、位元速率、抗性、時延、音畫同步(由 SDK 服務保障並提供技術指標)
  • 卡頓(流暢度):手機終端測試
  • 影片質量(人工):透過開源演算法進行評估

圖片質量不能完全代表影片質量,這個一定注意。有疑問的,看下圖(來源:騰訊會議)

2、音影片質量評估方案

2.1 影片評估方案

影片質量評估致力於評估影片的人眼感知質量,總的來說有兩種評估方式:

  • 主觀質量評估:依賴人眼觀看並打分,這種得到的分數比較精確,但是很耗時間,而且不方便大規模部署。
  • 客觀質量評估:主要是計算損傷影片的質量分數。評價一個演算法的好壞就是衡量主觀分數和客觀分數的相關係數,一般來說係數越高越好。

客觀質量評估演算法大概分三類,主要取決於是否使用無損的源影片作為參考。

  • 全參考:比如 PSNR 就是典型的全參考演算法,透過與源影片進行各種層面比對,來衡量損傷影片的質量。
  • 無參考:有的演算法不使用源影片,只使用接收端的影片,來衡量它自己本身的質量。
  • 部分參考: 比如從源影片中提取一個特徵向量,特徵向量隨著損傷影片一塊傳送到使用者端用來計算質量。視訊會議這種場景要做全參考本來是不現實的,因為不可能把本地無損的源影片送到使用者端或者其他地方計算質量,我們這次所做的工作就是把會議這種典型的實時場景轉化成一個可以使用全參考演算法離線最佳化的場景。

不同影片演算法在影片資料庫上的表現:
不同影片演算法在影片資料庫上的表現

透過調研發現,影片質量評估開源演算法,暫時以 netflix 的 VMAF 的為準,後期會增加騰訊開源的 DVQA 評估(DVQA 的模型以 PGC 影片的,不適合 UGC 的使用者場景)。
DVQA 開源版當前適用場景:

(1)netflix VMAF

  • 官方介紹 / 原始碼地址
  • VMAF 官方安裝指南/實際安裝有很多坑,建議看 mac 安裝指南
  • 原理:Video Multimethod Assessment Fusion,簡稱 VMAF,透過結合多種基本質量指標來預測主觀質量。其基本原理是,每個基本度量在源內容特徵、工件型別和扭曲程度方面都可能有自己的優點和缺點。透過使用機器學習演算法將基本度量 “融合” 成最終的度量標準ーー在我們的例子中是一個支援向量機迴歸子ーー它為每個基本度量標準賦予權重,最終的度量標準可以保留每個度量標準的所有優點,並提供一個更準確的最終得分。s
  • 開發技術說明:VDK 核心中的特徵提取 (包括初等度量計算) 是計算密集型的,為了提高效率,採用 c 語言編寫。控制程式碼是用 Python 編寫的,用於快速原型化。
  • 參考的基本指標:
    • 視覺資訊逼真度 (VIF):VIF 是一種被廣泛採用的影像質量度量方法,它的前提是影像質量與資訊保真度損失的度量相輔相成。在其原始形式,VIF 分數是衡量為一個失去保真度結合四個尺度。在 VMAF 中,我們採用了一個修正版的 VIF,其中每個尺度的保真度損失是作為一個基本的度量。
    • 詳細損失度量 (DLM):DLM 是一種影像質量度量方法,它的基本原理是分別測量影響內容可見性的細節損失,以及分散觀眾注意力的冗餘損失。最初的度量結合了 DLM 和加性損害測量 (AIM) ,以產生最終的得分。在 VMAF 中,我們只採用 DLM 作為一個基本的度量。特別注意特殊情況,如黑框,其中數值計算的原始公式打破。
    • Motion:測量相鄰幀之間時間差的簡單方法。這是透過計算亮度分量的平均絕對畫素差來實現的。
  • 使用: shell PYTHONPATH=python ./python/vmaf/script/run_vmaf.py \ yuv420p 576 324 \ python/test/resource/yuv/src01_hrc00_576x324.yuv \ python/test/resource/yuv/src01_hrc01_576x324.yuv \ --out-fmt json
  • 結果解析: 這將生成如下 JSON 輸出:
    • VMAF_score 得分是最終得分,得分範圍 0(最差)to 1(最好)
    • adm2, vif_scalex 得分範圍 0 (最差) to 1 (最好)
    • motion2 得分範圍 0 (靜止的) to 20 (高速運動的)

2.2 音訊評估方案

音訊質量評估演算法較多,從穩定性和評估緯度考慮,選擇 PESQ 和 STOI 進行音訊評估。
音訊質量評估相關介紹及程式碼見:https://testerhome.com/topics/25054

(1)PESQ

  • git:https://github.com/vBaiCai/python-pesq
  • 功能:透過輸入原始檔案和待評估檔案,輸出 PESQ 得分,得分範圍在-0.5--4.5 之間,得分越高表示語音質量越好。
  • 說明:PESQ 演算法需要帶噪的衰減訊號和一個原始的參考訊號。開始時將兩個待比較的語音訊號經過電平調整、輸入濾波器濾波、時間對準和補償、聽覺變換之後, 分別提取兩路訊號的引數, 綜合其時頻特性, 得到 PESQ 分數, 最終將這個分數對映到主觀平均意見分 (MOS)。PESQ 得分範圍在-0.5--4.5 之間。得分越高表示語音質量越好。

(2)可短時客觀可懂(STOI)

STOI:可短時客觀可懂,是用來評估在時域上經過掩蔽或經過短時傅立葉變換且頻域上加權的帶噪語音的可懂性。計算 STOI 時,用時間對其的純淨與混合語音訊號來計算每個音訊通道 kk K ( =1, ,  ) 與 400ms 短時分段 mm M ( =1, ,  ) 的中間值 d km ( , ) 。首先,對純淨和帶噪語音訊號進行短時傅立葉變換,得到第 j 個頻段第 n 個時間偵的短時能量譜 ( ) 2 X jn, 和 ( ) 2 Y jn, 。 將 j 個跨越 1/3 倍頻帶間隔的 ( ) 2 X jn, 和 ( ) 2 Y jn, 相加得到第 k 個音訊通道的能量譜 ( ) 2 X kn, 和 ( ) 2 Y kn, 。帶噪語音能量譜 ( ) 2 Y kn, 被限制為訊號失真比不能低於−15dB。中間值 d km ( , ) 是 ( ) 2 X km, 和 第 k 通道 m 分段的帶噪語音能量譜 ( ) ( ) 2 Y kn n N , 1, , =  的相關指數。STOI 評分 d 是帶噪語音每個頻帶可懂性的平均值,表示式如下: ( ) , 1 , k m d d km KM = ∑ STOI 透過對純淨語音和待評價的語音進行比較從而得到評分,取值範圍為 0-1。取值越高語音質量越好。

STOI 透過對純淨語音和待評價的語音進行比較從而得到評分,取值範圍為 0-1。取值越高語音質量 越好。

git:https://github.com/mpariente/pystoi

2.3 流暢度評估

  • (來源:騰訊)流暢度一般以卡頓率來反映,卡頓的資訊主要包含卡頓次數與卡頓時間;直播場景業界通常的卡頓定義是幀渲染間隔大於 1s 則為卡頓發生;但透過主觀實驗,一般這個值達到 200ms,觀眾即可感受到卡頓;
  • 卡頓率 = sum (>200ms 卡頓時間) / 通話時間;
  • 流媒體場景下的卡頓定義會採用不同的方法。
  • 流暢度評估原理(安卓):透過獲取 gfxinfo 中的幀資訊,統計幀耗時和卡頓率。

2.4 網路模擬工具

可透過模擬不同的網路環境,一方面驗證 SDK 承諾的各項效能指標是否合格,另一方面驗證弱網環境下的音影片質量。

(1)QNET 弱網測試工具

推薦使用 QNET,使用成本極低,且體驗很好。
只需要在裝置上安裝 APP,並用 QQ 登陸即可。弱網模擬環境穩定、安裝簡單。

(2)network emulator

弱網測試工具:network emulator,微軟開源,可實現頻寬、丟包、延時、抖動、綜合網路等弱網引數的限制。
弱網測試常用引數:
弱網測試常用引數

(2)facebook ATC

安裝及使用參考:https://testerhome.com/topics/15562

2.5 好用的測試框架

FR:@rikiesxiao (叉叉敵)

  • scikit-image 這個主要是對影片,圖片的一些演算法, 比如 PSNR, SSIM 等
  • QoSTestFramework 還有一個測試框架,這個也整合了 VMAF.

3、參考資料

UGC 質量評估:評估物件為短影片、直播、實時視訊通話等。

3.1 SDK 效能指標

(1)音影片 SDK 效能指標

騰訊資料來源:https://cloud.tencent.com/document/product/454/9867
推流狀態資料:

獲取播放的狀態資料:

3.2 影片質量標準及演算法

影片質量客觀評估就是量化一段影片透過影片傳輸/處理系統時畫面質量變化(通常是下降)程度的方法。

(1)影片評估演算法對比


指標解析:

  • PLCC:Pearson 線性相關係數,代表模型的線性相關性。
  • SROCC:Spearman 秩序相關係數,用來衡量秩序的相關性的,代表模型的非線性相關性。 假設有兩組序列 X 和 Y,其秩序為 R(X) 和 R(Y),則 SROCC(X, Y) = PLCC(R(X), R(Y))。

(2)騰訊會議開源的 DVQA

針對騰訊會議場景所開發的基於深度學習的實時影片全參考質量評估演算法。

騰訊會議使用深度學習設計了一個新的網格,來自動學習影片質量的相關特徵,然後在 PGC 資料集上訓練得到一個通用的網格。

  • 特點:
    • 足夠的準確度和區分度來衡量編解碼器效能;
    • PSNR、SSIM、MS-SSIM、VMAF,基於影像質量評估;
    • 使用深度學習來自動學習質量相關特徵;
    • 使用遷移學習來擴充已有模型到新的場景;
  • git 地址:https://github.com/Tencent/DVQA
  • 騰訊會議 線上影片質量打分平臺:來收集影片的主觀資料: mos.medialab.qq.com

騰訊影片也開發了端到端自動的質量評測系統,這是整體的框架圖。其實它的策略相對來說沒那麼複雜,就是在傳送端播放源影片,經過可控的損傷網路之後,另一邊是接收端,在接收端捕獲會議呈現的畫面,把這個畫面拿出來再結合傳送端的源影片去計算它的質量分數。前面提到的效能、位元速率這些絕對的指標都可以得到,抗性更多取決於什麼樣的網路情況下體驗特別糟糕,時延、卡頓、音畫同步、包括幀率都可以透過比對這兩個影片得到結果。

(3)netflix VMAF

  • 官方介紹
  • git:https://github.com/Netflix/vmaf
  • VMAF 安裝指南、mac 安裝指南
  • 原理:Video Multimethod Assessment Fusion,簡稱 VMAF,透過結合多種基本質量指標來預測主觀質量。其基本原理是,每個基本度量在源內容特徵、工件型別和扭曲程度方面都可能有自己的優點和缺點。透過使用機器學習演算法將基本度量 “融合” 成最終的度量標準ーー在我們的例子中是一個支援向量機迴歸子ーー它為每個基本度量標準賦予權重,最終的度量標準可以保留每個度量標準的所有優點,並提供一個更準確的最終得分。
  • 開發技術說明:VDK 核心中的特徵提取 (包括初等度量計算) 是計算密集型的,為了提高效率,採用 c 語言編寫。控制程式碼是用 Python 編寫的,用於快速原型化。
  • 參考的基本指標:

    • 視覺資訊逼真度 (VIF):VIF 是一種被廣泛採用的影像質量度量方法,它的前提是影像質量與資訊保真度損失的度量相輔相成。在其原始形式,VIF 分數是衡量為一個失去保真度結合四個尺度。在 VMAF 中,我們採用了一個修正版的 VIF,其中每個尺度的保真度損失是作為一個基本的度量。
    • 詳細損失度量 (DLM):DLM 是一種影像質量度量方法,它的基本原理是分別測量影響內容可見性的細節損失,以及分散觀眾注意力的冗餘損失。最初的度量結合了 DLM 和加性損害測量 (AIM) ,以產生最終的得分。在 VMAF 中,我們只採用 DLM 作為一個基本的度量。特別注意特殊情況,如黑框,其中數值計算的原始公式打破。
    • Motion:測量相鄰幀之間時間差的簡單方法。這是透過計算亮度分量的平均絕對畫素差來實現的。
    • vmaf 基本用法
    • 單模式執行:run_vmaf.py
    • 命令格式 shell PYTHONPATH=python ./python/vmaf/script/run_vmaf.py format width height reference_path distorted_path [--out-fmt output_format]
    • 命令解析: format 可以是: (1)uv420p, yuv422p, yuv444p (8-Bit YUV) (2)yuv420p10le, yuv422p10le, yuv444p10le (10-Bit little-endian YUV) width height 是影片的寬高度,以畫素為單位。
    • 結果解析 這將生成如下 JSON 輸出:
    • 其中 VMAF_score 得分是最終得分,其他是 VMAF 的基本指標得分。
      • adm2, vif_scalex 得分範圍 0 (最差) to 1 (最好)
      • motion2 得分範圍 0 (靜止的) to 20 (高速運動的)
  • 批處理模式執行: run_vmaf_in_batch.py

  • 命令列工具:ffmpeg2vmaf,提供了將壓縮影片流作為輸入的能力。

3.3 音訊質量標準

PESQ 和 PQLQA 都是業界公認的語音音質評估演算法;

(1)音訊評估緯度

A. 絕對等級評分 (MOS)

<!--br {mso-data-placement:same-cell;}--> td {white-space:pre-wrap;}音訊級別 MOS 值評價標準優 4.0~5.0 很好,聽得清楚;延遲小,交流流暢良 3.5~4.0 稍差,聽得清楚;延遲小,交流欠流暢,有點雜音中 3.0~3.5 還可以,聽不太清;有一定延遲,可以交流差 1.5~3.0 勉強,聽不太清;延遲較大,交流需要重複多遍劣 0~1.5 極差,聽不懂;延遲大,交流不通暢
一般 MOS 應為 4 或者更高,這可以被認為是比較好的語音質量,若 MOS 低於 3.6,則表示大部分被測不太滿意這個語音質量。
MOS 測試一般要求:

  1. 足夠多樣化的樣本(即試聽者和句子數量)以確保結果在統計上的顯著;
  2. 控制每個試聽者的實驗環境和裝置保持一致;
  3. 每個試聽者遵循同樣的評估標準。

B. 失真等級評分(Degradation Category Rating, DCR)

C. 相對等級評分(Comparative Category Rating, CCR)

(2)音訊評估演算法

A. python-pesq(PESQ)

  • git:https://github.com/vBaiCai/python-pesq
  • 功能:透過輸入原始檔案和待評估檔案,輸出 PESQ 得分,得分範圍在-0.5--4.5 之間,得分越高表示語音質量越好。
  • 說明:PESQ 演算法需要帶噪的衰減訊號和一個原始的參考訊號。開始時將兩個待比較的語音訊號經過電平調整、輸入濾波器濾波、時間對準和補償、聽覺變換之後, 分別提取兩路訊號的引數, 綜合其時頻特性, 得到 PESQ 分數, 最終將這個分數對映到主觀平均意見分 (MOS)。PESQ 得分範圍在-0.5--4.5 之間。得分越高表示語音質量越好。

B. 分段訊雜比(SegSNR)

由於語音訊號是一種緩慢變化的短時平穩訊號,因而在不同時間段上的訊雜比也應不一樣。為了改善訊雜比的問題,可以採用分段訊雜比。

C. 對數似然比測度(LLR)

坂倉距離測度是透過語音訊號的線性預測分析來實現的。ISD 基於兩組線性預測引數 (分別從原純淨語音和處理過的語音的同步幀得到) 之間的差異。LLR 可以看成一種坂倉距離(Itakura Distance,IS),但 IS 距離需要考慮模型增益。而 LLR 不考慮模型增益引起的幅度位移,更重視整體譜包絡的相似度。

D. 對數譜距離(LSD)

E. 可短時客觀可懂(STOI)

0-1 範圍,值越大,可懂度越高。

F. 加權譜傾斜測度(WSS)

WSS 值越小說明扭曲越少,越小越好,範圍

G. 感知客觀語音質量評估(POLQA)

POLQA,是一種全參考(FR)演算法,可對與原始訊號相關的降級或處理過的語音訊號進行評級。它將參考訊號(講話者側)的每個樣本與劣化訊號(收聽者側)的每個相應樣本進行比較。兩個訊號之間的感知差異被評為差異。
PQLQA 的音質評估涵蓋了可懂度、卡頓等聽感資訊;因為是有參演算法,所以不適合用於變聲一類的場景評估;除關心音質的評價值外,音質平穩性也會對聽感有較大影響。

4.5 音影片處理工具 FFmpeg

(1)統計位元速率

ffmpeg -i  /Users/lizhen/Downloads/mask.mp4  -hide_banner

輸出:

5、名詞解釋

(1)影片

  • 幀率:幀率對影片質量的影響遠遠大於解析度和 QP。
  • 解析度:就是幀大小每一幀就是一副影像。640*480 解析度的影片,建議影片的位元速率設定在 700 以上,音訊取樣率 44100 就行了。一個音訊編位元速率為 128Kbps,影片編位元速率為 800Kbps 的檔案,其總編位元速率為 928Kbps,意思是經過編碼後的資料每秒鐘需要用 928K 位元來表示。
  • QP:量化引數,反映了空間細節壓縮情況。值越小,量化越精細,影像質量越高,產生的碼流也越長。
  • 效能:
  • 位元速率:資料傳輸時單位時間傳送的資料位數,一般我們用的單位是 kbps 即千位每秒。 通俗一點的理解就是取樣率,單位時間內取樣率越大,精度就越高,處理出來的檔案就越接近原始檔案。
  • 抗性:
  • 時延:是網路傳輸中的一個重要指標,測量了資料從一個端點到另外一個端點所需的時間。一般我們用毫秒作為其單位。通常我們也把延遲叫做延時,但是延時有時還會表示資料包傳送端到接受端的往返時間。這個往返時間我們可以透過網路監控工具測量,測量資料包的傳送時間點和接受到確認的時間點,兩者之差就是延時。單向時間就是延遲。
  • 抖動:由於資料包的大小,網路路由的路徑選擇等眾多因素,我們無法保證資料包的延遲時間是一致的,資料包和資料包延遲的差異我們稱為抖動。也就是說因為資料包的延時值忽大忽小的現象我們稱為是抖動。
  • 卡頓:
  • 音畫同步:
  • YUV 影片格式(Android 中常用的 YUV420 格式):一般的影片採集晶片輸出的碼流一般都是 YUV 格式資料流,後續影片處理也是對 YUV 資料流進行編碼和解析。
    • YUV444:4 個畫素裡的資料有 4 個 Y、4 個 U、4 個 V,未丟棄任何資料。
    • YUV422:4 個畫素裡的資料有 4 個 Y、2 個 U、2 個 V。採集方式為 奇數畫素丟棄 V,偶數畫素丟棄 U。
    • YUV420:為橫向、縱向同時丟棄資料的取樣方式。
      • 取樣方式:偶數畫素丟棄 UV,在此基礎上,奇數行進一步丟棄 V,偶數行進一步丟棄 U。
    • 播放 YUV:ffplay -video_size 1080x2220 mini_yuvj420p_1080_2220.yuv
    • mp4 轉 YUV:ffmpeg -i mp4_file yuv_file
    • mp4 修改解析度:ffmpeg -i clean_mp4 -vf scale=1080:1024 denoised_mp4 -hide_banner
    • VMAF 比較兩個影片: python run_vmaf.py yuv420p 1080 2220 demo.yuv demo.yuv --out-fmt json

(2)音訊引數(參考資料)

  • 取樣頻率 (Sample Rate):也稱取樣率, 是指錄音裝置在單位時間內對聲音訊號的取樣數或樣本數, 單位為 Hz(赫茲), 取樣頻率越高能表現的頻率範圍就越大。 一些常用音訊取樣率如下: 8kHz - 電話所用取樣率 22.05kHz - 無線電廣播所用取樣率 44.1kHz - 音訊 CD, 也常用於 MPEG-1 音訊 (VCD, SVCD, MP3) 所用取樣率 48kHz - miniDV、數字電視、DVD、DAT、電影和專業音訊所用的數字聲音所用取樣率
  • 取樣位數 (Bit Depth, Sample Format, Sample Size, Sample Width), 也稱位深度, 是指採集卡在採集和播放聲音檔案時所使用數字聲音訊號的二進位制位數, 或者說是每個取樣樣本所包含的位數, 通常有 8 bit、16 bit。
  • 聲道數 (Channel), 是指採集卡在採集時使用聲道數, 分為單聲道 (Mono) 和雙聲道/立體聲 (Stereo)
  • 位元率 (Bit Rate), 也稱位率, 指每秒傳送的位元 (bit) 數, 單位為 bps(Bit Per Second), 位元率越高, 傳送資料速度越快. 聲音中的位元率是指將模擬聲音訊號轉換成數字聲音訊號後, 單位時間內的二進位制資料量。 其計算公式為: 位元率 = 取樣頻率 * 取樣位數 * 聲道數

相關文章