Adblock Radio是一个实时广播流和播客的广告拦-截-器。当然,本项目主要以拦截Shazam的广播流为主。
网址:https://www.adblockradio.com
项目地址:https://github.com/adblockradio/adblockradio
(注:划线部分链接要点击文末【阅读原文】才能访问哦!)
AdblockRadio.com的引擎。 这里有演示独立播放的演示demo。
技术讨论请点击:Link
无线广播流需要下载predictor.js和模块 adblockradio/stream-tireless-baler ,播客则下载predictor-file.js。
在这两种情况下,音频会被解码为单通道,22050 Hz PCM与ffmpeg。
大约一秒钟PCM音频块会被传送到两个子模块:
时频分析仪(predictor-ml/ml.js),用神经网络分析光谱内容。
指纹匹配器(predictor-db/hotlist.js),用于搜索已知广告、音乐或歌谣确切的出现次数。
在post-processing.js中,将会收集每个音频段的结果并进行清理。
可读接口Analyzer可以向最终用户公开。 它的流包含音频本身和所有分析结果的对象。
在普通笔记本电脑的CPU上运行的时候,文件的运行速度为5-10X,实时流的使用量为10-20%。
作为前提条件,你需要安装以下环境:
Node.js 和 NPM。该项目已经在8.*和10.* (NPM 分别是5.6.0及6.2.0)的节点上进行了测试。如果需要在平台上管理多个节点版本,则可能需要使用NVM。
Python (在v2.7.9版本上测试)。
Keras (在v2.0.8版本上测试),Keras的安装请点击Link
TensorFlow(在 TensorFlow v1.4.0 和 TensorFlow-GPU v1.3.0 版本上进行了测试),安装向导请点击Link
FFmpeg(在v2.6.9版本上进行了测试),安装向导请点击Link
然后再安装这个模块:
git clone
cd adblockradio
npm install
在启动时和运行时期间,会自动从 adblockradio.com/models/ 更新两个文件:
适用于时频分析仪的兼容机器学习模型(* .keras)。
指纹数据库(* .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": "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
}
]
注意,在分析音频文件的时候,你仍然要提供广播流的名称,因为该算法必须加载声学参数和已知样本的数据库。目前还不支持对与广播无关的播客进行分析,但将来可能会支持。
const { Analyser } = require("adblockradio");
const abr = new Analyser({
country: "France",
name: "RTL",
config: {
...
}
});
abr.on("data", function(obj) {
...
});
Property-属性 | Description-说明 | Default-默认值 |
country-国家 | Country of the radio stream according to radio-browser.info 根据radio-browser.info记录的广播流的国家 |
None |
name-名称 | Name of the radio stream according to radio-browser.info 根据radio-browser.info记录的广播流名称 |
None |
file-文件 | File to analyse (optional, analyse the live stream otherwise) 要分析的文件(可选,否则默认分析实时流) |
None |
请记住,你需要下载如上面的演示部分所示的模型。
标有 * 的属性仅用于实时广播流分析,而不是忽略它们的文件分析。
Property-属性 | Description-说明 | Default-默认值 |
predInterval | send stream status to listener every N seconds 每隔N秒将流状态发送给侦听器 |
1 |
saveDuration* | if enabled, save audio file and metadata every N predInterval times 如果启用,则每隔N次predInterval次数保存音频文件和元数据 |
10 |
modelUpdatesInterval | if enabled, update model files every N minutes 如果启用,则每N分钟更新一次模型文件 |
60 |
Property-属性 | Description-说明 | Periodicity-周期性 | Default-默认值 |
enablePredictorMl | perform machine learning inference 执行机器学习推理 |
predInterval | true |
enablePredictorHotlist | compute audio fingerprints and search them in a DB 计算音频指纹并在数据库中搜索它们 |
predInterval | true |
saveAudio* | save stream audio data in segments on hard drive 在硬盘上分段保存流音频数据 |
saveDuration | true |
saveMetadata | save a JSON with predictions 保存带有预测的JSON文件 |
saveDuration | true |
fetchMetadata* | gather metadata from radio websites 从电台网站收集元数据 |
saveDuration | true |
modelUpdates | keep ML and hotlist files up to date 保持机器学习和hotlist文件最新 |
modelUpdatesInterval | true |
Property-属性 | Description-说明 | Default-默认值 |
modelPath | directory where ML models and hotlist DBs are stored 存储ML模型和热门DB列表的目录 |
__dirname + '/model' |
saveAudioPath* | root folder where audio and metadata are saved 保存音频和元数据的根文件夹 |
__dirname + '/records' |
使用Analyzer构造的可读流将使用以下属性发出对象。某些属性仅在进行实时广播流分析时可用。它们标有 * ,其他特定于文件分析的标记为 ** 。
audio *:包含一大块原始(压缩)音频数据的缓冲区。
ml:如果不可用则为null,否则为包含时频分析器结果的对象
softmaxraw:由三个数字组成的数组,表示广告、语音和音乐之间的 softmax 。
softmax:与softmaxraw相同,但在未来使用slotsFuture数据点和过去的slotsPast数据点进行平滑处理。平滑权重由post-processing.js的consts.MOV_AVG_WEIGHTS定义。
class(分类):0-ads(广告),1-speech(讲话),2-music(音乐)或不确定。根据softmax分类。
hotlist:如果不可用则为null,否则为包含指纹匹配器结果的对象。
file:如果分类不是“不确定”,则识别文件的引用。
total:为给定音频段计算的指纹数。
matches(匹配):音频段和指纹数据库之间匹配的指纹数。
class:0-ads(广告),1-speech(讲话),2-music(音乐),3-jingles(歌谣)或不确定是否找不到足够的匹配。
class:算法的最终预测。 0-ads(广告),1-speech(讲话),2-music(音乐),3-jingles(歌谣)或不确定。
元数据*:实时元数据,由模块adblockradio/webradio-metadata提取和解析。
streamInfo *:有关流的静态元数据。 包含流URL,favicon,比特率(字节/秒),音频文件扩展名audioExt(mp3或aac)和 主页 URL。
gain-增益:表示流的平均音量的dB值。 如果你希望规范播放音量,则非常有用。 由mlpredict.py计算。
tBuffer *:音频缓冲区的秒数。 由adblockradio/stream-tireless-baler计算。
predictorStartTime *:算法启动的时间戳,有助于获得正常运行时间。
playTime *:播放给定音频的大致时间戳。 在TODO查看。
tStart **:与预测关联的时间间隔的下限(以毫秒为单位)
tEnd **:与预测相关的时间间隔的上限(以毫秒为单位)
支持的广播列表可在此处获得。
欢迎对本模块进行集成。这里有一些建议。
这里提供了一个用于Web浏览器的独立演示播放器。
查看许可文件。
感谢你对本项目的贡献,但是你可能需要遵守贡献者的许可协议。
网址:https://www.adblockradio.com
项目地址:https://github.com/adblockradio/adblockradio
【AI求职百题斩 - 每日一题】
赶紧来看看今天的题目吧!
想知道正确答案?
点击今日推文【第3条】或 在公众号回复“0117挑战”即可答题获取!