一個庫,可以阻止直播電台和播客上的廣告。機器學習遇到了Shazam。
Adblockradio.com的引擎。演示獨立播放器在這裡可用。
構建狀態:
幫助項目發展:
這裡有技術討論。
無線電流以模塊adblockradio/stream-tirevle-baler下載在predictor.js中。播客以predictor-file.js下載。
在這兩種情況下,隨後將音頻用ffmpeg解碼為22050 Hz PCM。
將大約一秒鐘的PCM音頻的塊將管道輸入兩個子模塊:
predictor-ml/ml.js ),通過神經網絡分析光譜含量。predictor-db/hotlist.js ),搜索已知的廣告,音樂或叮噹聲的確切出現。在post-processing.js中,為每個音頻段收集結果並清潔。
可讀的接口Analyser會暴露於最終用戶。它流式傳輸包含音頻本身和所有分析結果的對象。
在常規的筆記本電腦CPU和Python時頻分析儀上,文件的計算為5-10倍,實時流的使用率為10-20%。
您需要node.js(> = = v10.12.x,但<11)和npm。在這裡下載。 pro-tip:要在平台上管理多個節點版本,請使用NVM。
在Debian Stretch上:
apt-get install -y git ssh tar gzip ca-certificates build-essential sqlite3 ffmpeg注意:在傑西(Jessie)工作,但是安裝FFMPEG有點痛苦。請參閱這里和那裡。
為了獲得最佳性能(〜2倍速度),您應該選擇使用Python進行部分計算。其他先決條件如下:python(用v2.7.9),keras(用v2.0.8測試)和張量(用CPU V1.4.0和GPU V1.3.0測試)。
在Debian:
apt-get install python-dev portaudio19-dev
pip install python_speech_features h5py numpy scipy keras tensorflow zerorpc sounddevice psutil注意:如果您沒有PIP,請按照以下說明進行安裝。
git clone https://github.com/adblockradio/adblockradio.git
cd adblockradio
npm install使用測試套件驗證您的安裝:
npm test
在啟動和運行時定期,過濾器配置文件將自動從adblockradio.com/models/:
model.keras或model.json + group1-shard1of1 ),用於時頻分析儀。hotlist.sqlite )。 在法國RTL實時廣播流上運行演示:
node demo.js這是演示腳本的示例輸出,顯示了檢測到的廣告:
{
"gain": 74.63,
"ml": {
"class": "0-ads",
"softmaxraw": [
0.996,
0.004,
0
],
"softmax": [
0.941,
0.02,
0.039
],
"slotsFuture": 4,
"slotsPast": 5
},
"hotlist": {
"class": "9-unsure",
"file": null,
"matches": 1,
"total": 7
},
"class": "0-ads",
"metadata": {
"artist": "Laurent Ruquier",
"title": "L'été des Grosses Têtes",
"cover": "https://cdn-media.rtl.fr/cache/wQofzw9SfgHNHF1rqJA3lQ/60v73-2/online/image/2014/0807/7773631957_laurent-ruquier.jpg"
},
"streamInfo": {
"url": "http://streaming.radio.rtl.fr/rtl-1-44-128",
"favicon": "https://cdn-static.rtl.fr/versions/www/6.0.637/img/apple-touch-icon.png",
"homepage": "http://www.rtl.fr/",
"audioExt": "mp3"
},
"predictorStartTime": 1531150137583,
"playTime": 1531150155250,
"tBuffer": 15.98,
"audio": ...
}
也可以分析無線電記錄。在法國RTL廣播的錄音中運行演示,包括廣告,談話和音樂:
node demo-file.js逐漸的輸出與實時流分析的輸出相似。錄音的另一個後處理掩蓋了預測中的不確定性,並顯示了每個班級的大部分,並以毫秒為單位,使其為切片做好了準備。
[
{
"class": "1-speech",
"tStart": 0,
"tEnd": 58500
},
{
"class": "0-ads",
"tStart": 58500,
"tEnd": 125500
},
{
"class": "1-speech",
"tStart": 125500,
"tEnd": 218000
},
{
"class": "2-music",
"tStart": 218000,
"tEnd": 250500
},
{
"class": "1-speech",
"tStart": 250500,
"tEnd": 472949
}
]
請注意,在分析音頻文件時,您仍然需要提供無線電流的名稱,因為算法必須加載已知樣本的聲學參數和DB。對與無線電無關的播客的分析尚未支持,但可能是將來。
以下是一個簡單的用法示例。測試中提供了更透徹的用法示例:
test/file.jstest/online.jstest/offline.js const { Analyser } = require ( "adblockradio" ) ;
const abr = new Analyser ( {
country : "France" ,
name : "RTL" ,
config : {
...
}
} ) ;
abr . on ( "data" , function ( obj ) {
...
} ) ;| 財產 | 描述 | 預設 |
|---|---|---|
country | Radio-Browser.info表示,無線電流的國家 /地區 | 沒有任何 |
name | Radio-Browser.info的無線電流名稱 | 沒有任何 |
file | 文件進行分析(可選,否則分析實時流) | 沒有任何 |
啟動時會自動對聲學模型和熱列表文件自動刷新。如果您打算長時間連續運行ALGO,則可以觸發手動更新。注意這些方法僅在實時流分析模式下可用。
| 方法 | 參數 | 描述 |
|---|---|---|
refreshPredictorMl | 沒有任何 | 手動刷新ML模型(僅實時流) |
refreshPredictorHotlist | 沒有任何 | 手動刷新熱門列表DB(僅直播) |
refreshMetadata | 沒有任何 | 手動刷新元數據刮刀(僅直播) |
stopDl | 沒有任何 | 停止Adblock Radio(僅直播) |
標記為A *屬性僅用於實時無線電流分析,而不是忽略的文件分析。
| 財產 | 描述 | 預設 |
|---|---|---|
predInterval | 每n秒向聽眾發送流狀態 | 1 |
saveDuration* | 如果啟用,每n個predInterval時間保存音頻文件和元數據 | 10 |
modelUpdatesInterval | 如果啟用,每n分鐘更新一次模型文件 | 60 |
| 財產 | 描述 | 週期性 | 預設 |
|---|---|---|---|
enablePredictorMl | 執行機器學習推斷 | predInterval | true |
JSPredictorMl | 使用TFJ代替Python進行ML推理(較慢) | false | |
enablePredictorHotlist | 計算音頻指紋並在DB中搜索 | predInterval | true |
saveAudio* | 將流音頻數據保存在硬盤驅動器上的段 | saveDuration | true |
saveMetadata | 保存帶有預測的JSON | saveDuration | true |
fetchMetadata* | 從廣播網站收集元數據 | saveDuration | true |
modelUpdates | 保持最新的ML和熱門列表文件 | modelUpdatesInterval | true |
| 財產 | 描述 | 預設 |
|---|---|---|
modelPath | 存儲ML模型和熱門列表DB的目錄 | process.cwd() + '/model' |
modelFile | ML文件相對於modelPath的路徑 | country + '_' + name + '/model.keras' |
hotlistFile | 熱門列表數據庫相對於modelPath的路徑 | country + '_' + name + '/hotlist.sqlite' |
saveAudioPath* | 保存音頻和元數據的根文件夾 | process.cwd() + '/records' |
用Analyser構造的可讀流具有以下屬性。一些屬性僅在進行實時無線電分析時可用。他們被標記為* 。文件分析的其他特定於** 。
audio* :包含大量原始(壓縮)音頻數據的緩衝區。
ml : null ,如果不可用,則否則一個包含時頻分析儀結果的對象
softmaxraw :三個數字的數組,代表廣告,語音和音樂之間的SoftMax。softmax :與SoftMaxRaw相同,但將來用slotsFuture數據點進行平滑,並且過去slotsPast數據點。 post-processing.js權重由consts.MOV_AVG_WEIGHTS定義。class : 0-ads , 1-speech , 2-music或9-unsure 。根據softmax的分類。 hotlist :null如果不可用,則否則一個包含指紋匹配器結果的對象。
file :如果類不是“ 9-否”,則可以識別文件的引用。total :針對給定音頻段計算的指紋數量。matches :音頻段和指紋數據庫之間的匹配指紋數量。class :如果沒有找到足夠的匹配,則0-ads , 1-speech , 2-music , 3-jingles或9-unsure 。 class :算法的最終預測。 0-ads , 1-speech , 2-music , 3-jingles或9-unsure 。
metadata* :現場元數據,被模塊Adblockradio/Webradio-Metadata取出和解析。
streamInfo* :關於流的靜態元數據。包含流url , favicon , bitrate在字節 / s中,音頻文件擴展audioExt ( mp3或aac )和homepage URL。
gain :代表流的平均體積的DB值。如果您想將播放量標準化,有用。由mlpredict.py計算。
tBuffer* :音頻緩衝區的幾秒鐘。由Adblockradio/Stream-tirevle-Baller計算。
predictorStartTime* :算法啟動的時間戳。可以獲取正常運行時間。
playTime* :播放給定音頻的時間戳記。托多檢查一下。
tStart** :與預測相關的時間間隔的下邊界(以毫秒為單位)
tEnd** :與預測相關的時間間隔的上邊界(以毫秒為單位)
支持的收音機列表可在此處找到。
歡迎該模塊的集成。建議在這裡提供。
可以在此處提供用於Web瀏覽器的獨立演示播放器。
請參閱許可證文件。
歡迎您對該項目的貢獻,但可能需要遵守貢獻者的許可協議。