一个库,可以阻止直播电台和播客上的广告。机器学习遇到了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浏览器的独立演示播放器。
请参阅许可证文件。
欢迎您对该项目的贡献,但可能需要遵守贡献者的许可协议。