Найдите самую доминирующую звуковую частоту в образце

Я пытаюсь создать проект, который загружает аудиофайл в прямом эфире из Интернета и постоянно сэмплирует звук в поисках наиболее доминирующей частоты в течение заданного периода времени. Идея состоит в том, что если он обнаруживает частоту, скажем, 440 Гц в течение определенного периода времени (несколько секунд), это означает, что в прямом эфире воспроизводился определенный тон. Как только он обнаружит определенный тон, я заставлю его сделать что-то еще в программе. В прямом эфире либо говорят, либо один тон, либо тишина.

Я смог это сделать и получил доказательство работоспособности концепции, прочитав файл, который я сгенерировал из онлайн-генератора тонов. Когда я передаю этот файл, он правильно определяет частоту (она отключена всего на 1 или 2 Гц). Когда я запускаю прямую трансляцию, я получаю данные о частоте, что-то вроде: 17704 Гц. Я предполагаю, что это из-за "шума" прямой трансляции.

Я использую npm модули node-pitchfinder и audio-analyer для выполнения большей части обработки

Любые идеи о том, как получить один тон?

const fs = require('fs');
const fsa = require('fs-extra');
const Lame     = require('lame');
const Speaker  = require('speaker');
const Volume   = require('pcm-volume');
const Analyser = require('audio-analyser')
const request  = require('request')
const Chunker  = require('stream-chunker');
const { YIN } = require('node-pitchfinder')
const detectPitch = YIN({ sampleRate: 44100})
//const BUFSIZE  = 64;
const BUFSIZE  = 500;


var decoder   = new Lame.Decoder(); 
decoder.on('format', function(format){onFormat(format)});

var chunker  = Chunker(BUFSIZE);
chunker.pipe(decoder);  




var options = {
    url: 'http://relay.broadcastify.com/fq85hty701gnm4z.mp3',
    headers: {
        "Upgrade-Insecure-Requests": 1,
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15"
    }
}
var audio_stream = request(options);
//var audio_stream = fs.createReadStream('./2000.mp3');

audio_stream.pipe(chunker);

function onFormat(format)
{
    //if (volume == "undefined")
    volume = 1.0;

    vol      = new Volume(volume);
    speaker  = new Speaker(format);


    analyser = createAnalyser(format);
    analyser.on('data', sample);

    console.log(format);
    vol.pipe(speaker);  
    vol.pipe(analyser); 
    decoder.pipe(vol);
    vol.setVolume(volume);
}




function createAnalyser(format)
{
    return new Analyser({
        fftSize: 8,
            bufferSize: BUFSIZE,
            'pcm-stream': {
            channels: format.channels,
            sampleRate: format.sampleRate,
            bitDepth: format.bitDepth
        }
    });
}


var logFile = 'log.txt';
var logOptions = {flag: 'a'};

function sample()
{

    if (analyser) {

        const frequency = detectPitch(analyser._data)
        console.log(frequency)
    }
}

person Bill    schedule 08.12.2018    source источник
comment
Возможно, вам придется поставить фильтр перед модулем обнаружения высоты тона, чтобы отфильтровать все частоты, кроме интересующей. Интересующая вас частота не обязательно является доминирующей, если только она не очень громкая.   -  person Robert Harvey    schedule 08.12.2018
comment
Спасибо за предложение. Проблема в том, что я не знаю, какую частоту я хочу, пока не услышу ее. То, что я в основном слушаю, это тон или звуковой сигнал, который длится около 3 секунд.   -  person Bill    schedule 08.12.2018
comment
Вы можете найти кепстральный анализ, на который стоит обратить внимание.   -  person Sami Hult    schedule 08.12.2018
comment
Возможно, вы захотите изменить частоту дискретизации на более высокую. Ваша обнаруженная частота может быть результатом алиасинга.   -  person yunzen    schedule 20.12.2018


Ответы (1)