Uma biblioteca para bloquear anúncios em transmissões de rádio ao vivo e podcasts. O aprendizado de máquina conhece Shazam.
Engine do AdblockRadio.com. Demo Standalone Player disponível aqui.
Status de construção:
Ajude o projeto a crescer:
Uma discussão técnica está disponível aqui.
Os fluxos de rádio são baixados no predictor.js com o módulo AdblockRadio/Stream-Tireless-Baler. Os podcasts são baixados no predictor-file.js .
Nos dois casos, o áudio é então decodificado para PCM 22050 Hz de canal único com ffmpeg .
Pedaços de cerca de um segundo de áudio PCM são canalizados em dois sub-módulos:
predictor-ml/ml.js ), que analisa o conteúdo espectral com uma rede neural.predictor-db/hotlist.js ), que procura ocorrências exatas de anúncios, músicos ou jingles conhecidos. No post-processing.js , os resultados são coletados para cada segmento de áudio e limpos.
Uma interface legível, Analyser , é exposta ao usuário final. Ele transmite objetos que contêm o próprio áudio e todos os resultados da análise.
Em uma CPU de laptop regular e com o analisador de frequência de tempo do Python, os cálculos são executados em 5-10x para arquivos e a 10 a 20% de uso para transmissão ao vivo.
Você precisa de Node.js (> = v10.12.x, mas <11) e npm. Baixe aqui. PRO-TIP: Para gerenciar várias versões de nós em sua plataforma, use o NVM.
Em Debian Stretch:
apt-get install -y git ssh tar gzip ca-certificates build-essential sqlite3 ffmpegNota: funciona em Jessie, mas a instalação do FFMPEG é um pouco dolorosa. Veja aqui e ali.
Para melhor desempenho (~ 2x aceleração), você deve optar por fazer parte dos cálculos com o Python. Pré -requisitos adicionais são os seguintes: Python (testado com v2.7.9), Keras (testado com v2.0.8) e tensorflow (testado com CPU v1.4.0 e GPU v1.3.0).
No Debian:
apt-get install python-dev portaudio19-dev
pip install python_speech_features h5py numpy scipy keras tensorflow zerorpc sounddevice psutilNOTA: Se você não tiver, siga estas instruções para instalá -lo.
git clone https://github.com/adblockradio/adblockradio.git
cd adblockradio
npm installValidar sua instalação com o conjunto de testes:
npm test
Na inicialização e periodicamente durante o tempo de execução, os arquivos de configuração do filtro são atualizados automaticamente em adblockradio.com/models/:
model.keras ou model.json + group1-shard1of1 ), para o analisador de frequência de tempo.hotlist.sqlite ), para o Matcher de impressão digital. Execute a demonstração no fluxo francês de rádio ao vivo RTL:
node demo.jsAqui está uma amostra de saída do script de demonstração, mostrando um anúncio 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": ...
}
Também é possível analisar gravações de rádio. Execute a demonstração em uma gravação do rádio RTL francês, incluindo anúncios, palestras e música:
node demo-file.jsOs resultados graduais são semelhantes aos da análise de transmissão ao vivo. Um pós-processamento adicional específico para gravações oculta as incertezas nas previsões e mostra grandes pedaços para cada classe, com carimbos de hora em milissegundos, preparando-o para fatiar.
[
{
"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
}
]
Observe que, ao analisar arquivos de áudio, você ainda precisa fornecer o nome de um fluxo de rádio, porque o algoritmo precisa carregar parâmetros acústicos e db de amostras conhecidas. A análise de podcasts não vinculados a um rádio ainda não é suportada, mas pode estar no futuro.
Abaixo está um exemplo de uso simples. Exemplos de uso mais completos estão disponíveis nos testes:
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 ) {
...
} ) ;| Propriedade | Descrição | Padrão |
|---|---|---|
country | Country of the Radio Stream de acordo com o Radio-Browser.info | Nenhum |
name | Nome do fluxo de rádio De acordo com o Radio-Browser.info | Nenhum |
file | Arquivo para analisar (opcional, analisar a transmissão ao vivo de outra forma) | Nenhum |
O modelo acústico e os arquivos HotList são atualizados automaticamente na inicialização. Se você planeja executar continuamente o Algo por um longo tempo, poderá acionar atualizações manuais. Nota Esses métodos estão disponíveis apenas no modo de análise de transmissão ao vivo.
| Método | Parâmetros | Descrição |
|---|---|---|
refreshPredictorMl | Nenhum | Atualize manualmente o modelo ML (somente transmissão ao vivo) |
refreshPredictorHotlist | Nenhum | Atualize manualmente o hotlist db (somente transmissão ao vivo) |
refreshMetadata | Nenhum | Atualize manualmente o raspador de metadados (somente transmissão ao vivo) |
stopDl | Nenhum | Pare o Rádio Adblock (somente transmissão ao vivo) |
As propriedades marcadas com A * devem ser usadas apenas com análise de fluxos de rádio ao vivo, e não a análise de arquivos onde são ignorados.
| Propriedade | Descrição | Padrão |
|---|---|---|
predInterval | Envie o status do fluxo para o ouvinte a cada N Segundos | 1 |
saveDuration* | Se ativado, salve o arquivo de áudio e os metadados a cada N predInterval Times | 10 |
modelUpdatesInterval | Se ativado, atualize os arquivos do modelo a cada N minutos | 60 |
| Propriedade | Descrição | Periodicidade | Padrão |
|---|---|---|---|
enablePredictorMl | Executar inferência de aprendizado de máquina | predInterval | true |
JSPredictorMl | Use TFJs em vez de Python para inferência de ML (mais lenta) | false | |
enablePredictorHotlist | Calcule impressões digitais de áudio e pesquisá -las em um banco de dados | predInterval | true |
saveAudio* | Salvar dados de áudio do fluxo em segmentos no disco rígido | saveDuration | true |
saveMetadata | Salve um json com previsões | saveDuration | true |
fetchMetadata* | Reúna metadados de sites de rádio | saveDuration | true |
modelUpdates | Mantenha os arquivos ML e HotList atualizados | modelUpdatesInterval | true |
| Propriedade | Descrição | Padrão |
|---|---|---|
modelPath | Diretório onde os modelos ML e DBs HotList são armazenados | process.cwd() + '/model' |
modelFile | Caminho do arquivo ML em relação ao modelPath | country + '_' + name + '/model.keras' |
hotlistFile | Caminho do DB HotList em relação ao modelPath | country + '_' + name + '/hotlist.sqlite' |
saveAudioPath* | Pasta raiz onde áudio e metadados são salvos | process.cwd() + '/records' |
Fluxos legíveis construídos com Analyser emitem objetos com as seguintes propriedades. Algumas propriedades estão disponíveis apenas ao fazer análises de rádio ao vivo. Eles são marcados com A * . Outros específicos para análise de arquivos estão marcados com ** .
audio* : buffer contendo um pedaço de dados de áudio originais (compactados).
ml : null se não estiver disponível, caso contrário, um objeto que contém os resultados do analisador de frequência de tempo
softmaxraw : Uma matriz de três números representando a MAX SOFTS entre anúncios, fala e música.softmax : o mesmo que o softmaxraw, mas suavizou no tempo com pontos de dados slotsFuture no futuro e os pontos de dados slotsPast no passado. Os pesos de suavização são definidos por consts.MOV_AVG_WEIGHTS no post-processing.js .class : 0-ads , 1-speech , 2-music ou 9-unsure . A classificação de acordo com softmax . hotlist : NULL, se não estiver disponível, caso contrário, um objeto que contém os resultados do Matcher de impressão digital.
file : Se a classe não for "9-insure", a referência do arquivo reconhecida.total : Número de impressões digitais calculadas para o segmento de áudio fornecido.matches : Número de impressões digitais correspondentes entre o segmento de áudio e o banco de dados de impressão digital.class : 0-ads , 1-speech , 2-music , 3-jingles ou 9-unsure se não houver correspondências suficientes foram encontradas. class : Previsão final do algoritmo. 0-ads , 1-speech , 2-music , 3-jingles ou 9-unsure .
metadata* : Metadados ao vivo, buscados e analisados pelo módulo AdBlockRadio/Webradio-metadata.
streamInfo* : metadados estáticos sobre o fluxo. Contém url de fluxo, favicon , bitrate em bytes / s, arquivos de áudio Extension audioExt ( mp3 ou aac ) e URL homepage .
gain : um valor de db que representa o volume médio do fluxo. Útil se você deseja normalizar o volume de reprodução. Calculado por mlpredict.py .
tBuffer* : segundos de buffer de áudio. Calculado por adblockradio/stream-tireless-baler.
predictorStartTime* : registro de data e hora da inicialização do algoritmo. Útil para obter o tempo de atividade.
playTime* : Timestamp aproximado de quando o áudio fornecido deve ser reproduzido. TODO Verifique isso.
tStart** : Limite inferior do intervalo de tempo ligado à previsão (em milissegundos)
tEnd** : limite superior do intervalo de tempo ligado à previsão (em milissegundos)
A lista de rádios suportados está disponível aqui.
As integrações deste módulo são bem -vindas. Sugestões estão disponíveis aqui.
Um jogador de demonstração independente para navegadores da web está disponível aqui.
Consulte o arquivo de licença.
Sua contribuição para este projeto é bem -vinda, mas pode estar sujeita ao contrato de licença de um colaborador.