如何切割出音頻文件中的音樂段落與人聲段落?

廣播節目mp3,主持人說一段話放幾首歌,現在我想把說話和歌曲分開,分別生成「說話.mp3」和「音樂.mp3」 編程小白覺得應該不難實現,請教達人指點一些方向! 多謝!


啊啊,我審錯題了,題主要做的是把音頻文件切割成人聲和音樂(其實還有靜音)的段落,是diarization而不是separation……

關於這個任務,我並不知道現在最前沿的方法是什麼,就想到哪裡說到哪裡吧。

首先,有兩大類方法:有監督的和無監督的。

有監督的意思就是你已經有一些數據,標好了哪些段落是人聲,哪些段落是音樂,哪些段落是靜音。

在這種情況下,你可以對這些訓練數據逐幀提取一些聲學特徵(多多益善,比如用OpenSMILE提取幾千維的特徵),訓練一個分類器。然後對測試數據同樣提取特徵,用分類器對每一幀進行分類,再把輸出平滑一下。鑒於這是一個相對簡單的任務,分類器用SVM或者logistic regression應該就差不多了,當然如果你想用DNN甚至RNN也可以。

不過我估計題主是沒有訓練數據的,所以只能採用無監督的方法。

這時,就需要設計有用的聲學特徵,來區分人聲、音樂和靜音。

靜音比較容易區分,最簡單的方法就是給幅度設個閾值。

人聲和音樂有兩點主要的不同:

  • 人聲是單個聲源發出的,大部分時間有一個單一的基頻(當然發清輔音時沒有),而音樂一般是多個聲源發出的,有多個混在一起的基頻。
  • 人聲的基頻不穩定,而音樂的基頻較穩定。

針對這兩點不同,我覺得可以使用如下兩種聲學特徵:

  • 基頻提取器(pitch tracker)對提取結果的信心——人聲部分會較高,音樂部分會較低;
  • 基頻變化率(fundamental frequency variation, FFV)——人聲部分會偏離0,音樂部分會接近0。

對每一幀提取出這些聲學特徵後,可以進行聚類(clustering),來得到哪些幀是人聲,哪些幀是音樂;當然,結果也需要平滑。

=========原答案=========

有許多音頻文件(大約一半以上?),人聲在兩個聲道中是相同的,但伴奏不同。

對於這樣的文件,把兩個聲道相減就可以去掉人聲,得到伴奏。

不過,這樣做只能得到伴奏,不能得到人聲;而且伴奏就不再是立體聲了。

對於單聲道音頻,或者上述方法無效的雙聲道音頻,分離人聲與伴奏就不是一個trivial的問題了。

這是音頻處理領域一個研究課題,稱為source separation。題主可以以這個關鍵詞去搜論文。


begeekmyfriend/ezfm_diarisation


有個叫好工具箱的網站可以在線截取音樂的一部分,不用安裝軟體,用起來很簡單。

http://www.haogongjuxiang.com/ypbfjq/


推薦閱讀:

PFC5.0中的Range演算法
情人節,用C++畫一個心:)
「壓」之貪心
成功人士從不刷Leetcode(4)

TAG:演算法 | 人聲 | 音頻處理 |