Una biblioteca para bloquear anuncios en transmisiones de radio en vivo y podcasts. El aprendizaje automático se encuentra con Shazam.
Motor de AdBlockradio.com. Demo Standalone Player disponible aquí.
Estado de construcción:
Ayuda al proyecto a crecer:
Una discusión técnica está disponible aquí.
Las transmisiones de radio se descargan en predictor.js con el módulo AdBlockRadio/Stream-Toneless-Baler. Los podcasts se descargan en predictor-file.js .
En ambos casos, el audio se decodifica a PCM 22050 Hz con ffmpeg .
Los trozos de aproximadamente un segundo de audio PCM se tienen en dos submódulos:
predictor-ml/ml.js ), que analiza el contenido espectral con una red neuronal.predictor-db/hotlist.js ), que busca ocurrencias exactas de anuncios, músicas o jingles conocidos. En post-processing.js , los resultados se recopilan para cada segmento de audio y se limpian.
Una interfaz legible, Analyser , está expuesta al usuario final. Transmite objetos que contienen el audio en sí y todos los resultados del análisis.
En una CPU portátil regular y con el analizador de frecuencia de tiempo de Python, los cálculos se ejecutan en 5-10X para archivos y en el 10-20% de uso para la transmisión en vivo.
Necesita Node.js (> = v10.12.x, pero <11) y npm. Descárguelo aquí. Pro-Tip: para administrar varias versiones de nodo en su plataforma, use NVM.
En el estiramiento de Debian:
apt-get install -y git ssh tar gzip ca-certificates build-essential sqlite3 ffmpegNota: Funciona en Jessie, pero instalar FFMPEG es un poco doloroso. Ver aquí y allá.
Para el mejor rendimiento (~ 2x Speedup) debe elegir hacer parte de los cálculos con Python. Los requisitos previos adicionales son los siguientes: Python (probado con V2.7.9), Keras (probado con V2.0.8) y TensorFlow (probado con CPU V1.4.0 y GPU V1.3.0).
En Debian:
apt-get install python-dev portaudio19-dev
pip install python_speech_features h5py numpy scipy keras tensorflow zerorpc sounddevice psutilNota: Si no tiene PIP, siga estas instrucciones para instalarlo.
git clone https://github.com/adblockradio/adblockradio.git
cd adblockradio
npm installValide su instalación con la suite de prueba:
npm test
Al inicio y periódicamente durante el tiempo de ejecución, los archivos de configuración de filtro se actualizan automáticamente desde adblockradio.com/models/:
model.keras o model.json + group1-shard1of1 ), para el analizador de frecuencia de tiempo.hotlist.sqlite ), para la ficha de huellas digitales. Ejecute la demostración en French RTL Live Radio Stream:
node demo.jsAquí hay una salida de muestra del script de demostración, que muestra un anuncio detectado:
{
"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": ...
}
También es posible analizar las grabaciones de radio. Ejecute la demostración en una grabación de la radio RTL francesa, incluidos anuncios, charlas y música:
node demo-file.jsLas salidas graduales son similares a las del análisis de transmisión en vivo. Un postprocesamiento adicional específico para las grabaciones oculta las incertidumbres en las predicciones y muestra grandes fragmentos para cada clase, con sellos de tiempo en milisegundos, lo que lo hace listo para cortar.
[
{
"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
}
]
Tenga en cuenta que al analizar archivos de audio, aún necesita proporcionar el nombre de una transmisión de radio, porque el algoritmo tiene que cargar parámetros acústicos y DB de muestras conocidas. El análisis de podcasts no está vinculados a una radio aún no es compatible, pero posiblemente sea en el futuro.
A continuación se muestra un simple ejemplo de uso. Hay ejemplos de uso más exhaustivos disponibles en las pruebas:
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 ) {
...
} ) ;| Propiedad | Descripción | Por defecto |
|---|---|---|
country | País de la transmisión de radio según Radio-Browser.info | Ninguno |
name | Nombre de la transmisión de radio según Radio-Browser.info | Ninguno |
file | Archivo para analizar (opcional, analizar la transmisión en vivo de lo contrario) | Ninguno |
El modelo acústico y los archivos de Hotsist se actualizan automáticamente al inicio. Si planea ejecutar continuamente el algo durante mucho tiempo, puede activar actualizaciones manuales. Tenga en cuenta que esos métodos solo están disponibles en el modo de análisis de transmisión en vivo.
| Método | Parámetros | Descripción |
|---|---|---|
refreshPredictorMl | Ninguno | Actualice manualmente el modelo ML (solo transmisión en vivo) |
refreshPredictorHotlist | Ninguno | Actualice manualmente el DB HotList (solo transmisión en vivo) |
refreshMetadata | Ninguno | Actualice manualmente el raspador de metadatos (solo transmisión en vivo) |
stopDl | Ninguno | Stop AdBlock Radio (solo transmisión en vivo) |
Las propiedades marcadas con A * están destinadas a usarse solo con el análisis de transmisión de radio en vivo, no el análisis de archivos donde se ignoran.
| Propiedad | Descripción | Por defecto |
|---|---|---|
predInterval | Enviar el estado de transmisión al oyente cada n segundos | 1 |
saveDuration* | Si está habilitado, guarde el archivo de audio y los metadatos cada n predInterval Times | 10 |
modelUpdatesInterval | Si está habilitado, actualice los archivos de modelo cada n minutos | 60 |
| Propiedad | Descripción | Periodicidad | Por defecto |
|---|---|---|---|
enablePredictorMl | Realizar inferencia de aprendizaje automático | predInterval | true |
JSPredictorMl | Use TFJS en lugar de Python para la inferencia de ML (más lento) | false | |
enablePredictorHotlist | Calcule las huellas digitales de audio y búscalas en un DB | predInterval | true |
saveAudio* | Guardar los datos de audio de flujo en segmentos en el disco duro | saveDuration | true |
saveMetadata | Guardar un JSON con predicciones | saveDuration | true |
fetchMetadata* | Recopilar metadatos de sitios web de radio | saveDuration | true |
modelUpdates | Mantenga los archivos de ML y HotList actualizado | modelUpdatesInterval | true |
| Propiedad | Descripción | Por defecto |
|---|---|---|
modelPath | Directorio donde se almacenan los modelos ML y DBS Hotsist | process.cwd() + '/model' |
modelFile | Ruta del archivo ML en relación con modelPath | country + '_' + name + '/model.keras' |
hotlistFile | Path of the Hotlist DB en relación con modelPath | country + '_' + name + '/hotlist.sqlite' |
saveAudioPath* | Carpeta raíz donde se guardan el audio y los metadatos | process.cwd() + '/records' |
Estudias legibles construidas con objetos de emitir Analyser con las siguientes propiedades. Algunas propiedades solo están disponibles al hacer análisis de radio en vivo. Están marcados con un * . Otros específicos para el análisis de archivos están marcados con ** .
audio* : Buffer que contiene una parte de datos de audio originales (comprimidos).
ml : null Si no está disponible, de lo contrario, un objeto que contiene los resultados del analizador de frecuencia de tiempo
softmaxraw : una matriz de tres números que representan el Softmax entre anuncios, habla y música.softmax : igual que Softmaxraw, pero se suavizó en el tiempo con puntos de datos slotsFuture en el futuro y puntos de datos slotsPast en el pasado. Los pesos de suavizado están definidos por consts.MOV_AVG_WEIGHTS en post-processing.js .class : o 0-ads , 1-speech , 2-music o 9-unsure . La clasificación según softmax . hotlist : NULL Si no está disponible, de lo contrario, un objeto que contiene los resultados de la combinación de huellas digitales.
file : si la clase no es "9-Unsure", la referencia del archivo reconocida.total : Número de huellas digitales calculadas para el segmento de audio dado.matches : número de huellas digitales coincidentes entre el segmento de audio y la base de datos de huellas digitales.class : ya sea 0-ads , 1-speech , 2-music , 3-jingles o 9-unsure , si no se han encontrado suficientes coincidencias. class : Predicción final del algoritmo. Ya sea 0-ads , 1-speech , 2-music , 3-jingles o 9-unsure .
metadata* : Metadatos en vivo, obtenidos y analizados por el módulo AdBlockradio/Webradio-Metadata.
streamInfo* : metadatos estáticos sobre la corriente. Contiene url de transmisión, favicon , bitrate en bytes / s, extensión de archivos de audio audioExt ( mp3 o aac ) y URL homepage .
gain : un valor de DB que representa el volumen promedio de la transmisión. Útil si desea normalizar el volumen de reproducción. Calculado por mlpredict.py .
tBuffer* : segundos de búfer de audio. Calculado por AdBlockRadio/Stream-Toneless-Baler.
predictorStartTime* : marca de tiempo de la inicio del algoritmo. Útil para obtener el tiempo de actividad.
playTime* : marca de tiempo aproximada de cuándo se reproduce el audio dado. ¡Vea esto.
tStart** : límite inferior del intervalo de tiempo vinculado con la predicción (en milisegundos)
tEnd** : límite superior del intervalo de tiempo vinculado con la predicción (en milisegundos)
La lista de radios compatibles está disponible aquí.
Las integraciones de este módulo son bienvenidas. Las sugerencias están disponibles aquí.
Un reproductor de demostración independiente para navegadores web está disponible aquí.
Ver archivo de licencia.
Su contribución a este proyecto es bienvenida, pero podría estar sujeta a un acuerdo de licencia de contribuyente.