Une bibliothèque pour bloquer les annonces sur les flux de radio en direct et les podcasts. L'apprentissage automatique rencontre Shazam.
Moteur d'adblockradio.com. Player autonome de démonstration disponible ici.
Statut de construction:
Aidez le projet à grandir:
Une discussion technique est disponible ici.
Les flux de radio sont téléchargés dans predictor.js avec le module adblockradio / stream-inless-baleur. Les podcasts sont téléchargés dans predictor-file.js .
Dans les deux cas, l'audio est ensuite décodé en PCM à un seul canal à canal 22050 Hz avec ffmpeg .
Des morceaux d'environ une seconde d'audio PCM sont tués en deux sous-modules:
predictor-ml/ml.js ), qui analyse le contenu spectral avec un réseau neuronal.predictor-db/hotlist.js ), qui recherche des occurrences exactes d'annonces, musiques ou jingles connus. Dans post-processing.js , les résultats sont recueillis pour chaque segment audio et nettoyés.
Une interface lisible, Analyser , est exposée à l'utilisateur final. Il diffuse des objets contenant l'audio lui-même et tous les résultats de l'analyse.
Sur un CPU ordinaire ordinaire et avec l'analyseur Python Time-Freency, les calculs s'exécutent à 5-10x pour les fichiers et à 10-20% d'utilisation pour le flux en direct.
Vous avez besoin de node.js (> = v10.12.x, mais <11) et npm. Téléchargez-le ici. Pro-TIP: Pour gérer plusieurs versions de nœuds sur votre plateforme, utilisez NVM.
Sur Debian Stretch:
apt-get install -y git ssh tar gzip ca-certificates build-essential sqlite3 ffmpegRemarque: fonctionne sur Jessie, mais l'installation de FFMPEG est un peu douloureuse. Voir ici et là.
Pour les meilleures performances (~ 2x accélération), vous devez choisir de faire une partie des calculs avec Python. Des conditions supplémentaires supplémentaires sont les suivantes: Python (testé avec v2.7.9), Keras (testé avec v2.0.8) et TensorFlow (testé avec CPU V1.4.0 et GPU V1.3.0).
Sur Debian:
apt-get install python-dev portaudio19-dev
pip install python_speech_features h5py numpy scipy keras tensorflow zerorpc sounddevice psutilRemarque: Si vous n'avez pas PIP, suivez ces instructions pour l'installer.
git clone https://github.com/adblockradio/adblockradio.git
cd adblockradio
npm installValidez votre installation avec la suite de tests:
npm test
Au démarrage et périodiquement pendant l'exécution, les fichiers de configuration du filtre sont automatiquement mis à jour à partir d'adblockradio.com/models/:
model.keras ou model.json + group1-shard1of1 ), pour l'analyseur de fréquence temporelle.hotlist.sqlite ), pour le matchur d'empreintes digitales. Exécutez la démo sur le flux de radio en direct RTL français:
node demo.jsVoici un exemple de sortie du script de démonstration, montrant une annonce détectée:
{
"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": ...
}
Il est également possible d'analyser les enregistrements radio. Exécutez la démo sur un enregistrement de la radio RTL française, y compris les publicités, les discussions et la musique:
node demo-file.jsLes sorties progressives sont similaires à celles de l'analyse des flux en direct. Un post-traitement supplémentaire spécifique aux enregistrements cache les incertitudes dans les prédictions et montre de gros morceaux pour chaque classe, avec des horodatages en millisecondes, ce qui le prépare à trancher.
[
{
"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
}
]
Notez que lors de l'analyse des fichiers audio, vous devez toujours fournir le nom d'un flux radio, car l'algorithme doit charger des paramètres acoustiques et une base de données d'échantillons connus. L'analyse des podcasts non liées à une radio n'est pas encore prise en charge, mais peut être à l'avenir.
Vous trouverez ci-dessous un exemple d'utilisation simple. Des exemples d'utilisation plus approfondis sont disponibles dans les tests:
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 ) {
...
} ) ;| Propriété | Description | Défaut |
|---|---|---|
country | Pays du flux radio selon radio-browser.info | Aucun |
name | Nom du flux radio selon radio-navigateur.info | Aucun |
file | Fichier à analyser (facultatif, analyser le flux en direct autrement) | Aucun |
Le modèle acoustique et les fichiers hotlist sont actualisés automatiquement au démarrage. Si vous prévoyez d'exécuter l'algo en continu pendant longtemps, vous pouvez déclencher des mises à jour manuelles. Remarque Ces méthodes ne sont disponibles qu'en mode d'analyse de flux en direct.
| Méthode | Paramètres | Description |
|---|---|---|
refreshPredictorMl | Aucun | Rafraîchir manuellement le modèle ML (diffusion en direct uniquement) |
refreshPredictorHotlist | Aucun | Rafraîchir manuellement la DB Hotlist (Stream Only) |
refreshMetadata | Aucun | Rafraîchir manuellement le grattoir des métadonnées (flux en direct uniquement) |
stopDl | Aucun | Arrêtez la radio Adblock (diffusion en direct uniquement) |
Les propriétés marquées avec A * sont censées être utilisées uniquement avec une analyse de flux de radio en direct, et non une analyse de fichiers où elles sont ignorées.
| Propriété | Description | Défaut |
|---|---|---|
predInterval | Envoyer l'état du flux à l'écoute toutes les n secondes | 1 |
saveDuration* | Si vous activez, enregistrez le fichier audio et les métadonnées tous les predInterval | 10 |
modelUpdatesInterval | Si vous êtes activé, mettez à jour les fichiers du modèle toutes les n minutes | 60 |
| Propriété | Description | Périodicité | Défaut |
|---|---|---|---|
enablePredictorMl | Effectuer une inférence d'apprentissage automatique | predInterval | true |
JSPredictorMl | Utilisez des TFJ au lieu de Python pour l'inférence ML (plus lent) | false | |
enablePredictorHotlist | Calculez les empreintes digitales audio et recherchez-les dans une base de données | predInterval | true |
saveAudio* | Enregistrer les données audio Stream dans les segments sur le disque dur | saveDuration | true |
saveMetadata | Enregistrer un JSON avec des prédictions | saveDuration | true |
fetchMetadata* | Rassemblez les métadonnées des sites Web de radio | saveDuration | true |
modelUpdates | Gardez les fichiers ML et Hotlist à jour | modelUpdatesInterval | true |
| Propriété | Description | Défaut |
|---|---|---|
modelPath | Répertoire où les modèles ML et les DBs Hotlist sont stockés | process.cwd() + '/model' |
modelFile | Chemin du fichier ML par rapport à modelPath | country + '_' + name + '/model.keras' |
hotlistFile | Chemin de la DB Hotlist par rapport à modelPath | country + '_' + name + '/hotlist.sqlite' |
saveAudioPath* | Dossier racine où l'audio et les métadonnées sont enregistrés | process.cwd() + '/records' |
Des flux lisibles construits avec Analyser émettent des objets avec les propriétés suivantes. Certaines propriétés ne sont disponibles que lors de l'analyse radio en direct. Ils sont marqués par A * . Les autres spécifiques à l'analyse des fichiers sont marqués avec ** .
audio* : tampon contenant un morceau de données audio originales (compressées).
ml : null Si ce n'est pas disponible, sinon un objet contenant les résultats de l'analyseur de fréquence temporelle
softmaxraw : un tableau de trois nombres représentant le softmax entre les publicités, la parole et la musique.softmax : Identique à SoftMaxraw, mais lissé dans le temps avec des points de données slotsFuture à l'avenir et des points de données slotsPast dans le passé. Les poids de lissage sont définis par consts.MOV_AVG_WEIGHTS dans post-processing.js .class : 0-ads , 1-speech , 2-music ou 9-unsure . La classification selon softmax . hotlist : NULL Si ce n'est pas disponible, sinon un objet contenant les résultats du Matcher d'empreintes digitales.
file : Si la classe n'est pas "9-unsure", la référence du fichier reconnu.total : Nombre d'empreintes digitales calculées pour le segment audio donné.matches : Nombre d'empreintes digitales correspondantes entre le segment audio et la base de données d'empreintes digitales.class : 0-ads , 1-speech , 2-music , 3-jingles ou 9-unsure sinon suffisamment de matchs ont été trouvés. class : Prédiction finale de l'algorithme. Soit 0-ads , 1-speech , 2-music , 3-jingles ou 9-unsure .
metadata* : métadonnées en direct, récupérées et analysées par le module adblockradio / webradio-metadata.
streamInfo* : métadonnées statiques autour du flux. Contient url de flux, favicon , bitrate en octets / s, une extension de fichiers audio audioExt ( mp3 ou aac ) et URL homepage .
gain : une valeur de base de données représentant le volume moyen du flux. Utile si vous souhaitez normaliser le volume de lecture. Calculé par mlpredict.py .
tBuffer* : secondes de tampon audio. Calculé par Adblockradio / Stream Immating-Baleur.
predictorStartTime* : horodatage du démarrage de l'algorithme. Utile pour obtenir le temps de disponibilité.
playTime* : horodatage approximatif du moment où l'audio donné doit être joué. TODO Vérifiez ceci.
tStart** : limite inférieure de l'intervalle de temps lié à la prédiction (en millisecondes)
tEnd** : limite supérieure de l'intervalle de temps lié à la prédiction (en millisecondes)
La liste des radios prises en charge est disponible ici.
Les intégrations de ce module sont les bienvenues. Des suggestions sont disponibles ici.
Un lecteur de démonstration autonome pour les navigateurs Web est disponible ici.
Voir le fichier de licence.
Votre contribution à ce projet est la bienvenue, mais pourrait être soumise à un accord de licence d'un contributeur.