在样本中找到最显著的音频频率

12

我试图创建一个项目,从互联网中获取实时流媒体音频文件,并连续取样音频以寻找给定时间段内的最主导频率。想法是,如果它在一段时间内(几秒钟)检测到440Hz的频率,那么意味着在实时流媒体上播放了特定的音调。一旦检测到特定音调,我会让它在程序中执行其他操作。直播流可以是讲话、单个音调或静音。

我已经能够做到这一点,并得到了一个来自在线音调生成器生成的文件的概念验证结果。当我传入该文件时,它可以正确地识别频率(只有1或2 Hz的误差)。当我拉入实时流时,我得到的频率数据大约是:17704Hz。我猜测这是来自实时流的“噪声”。

我正在使用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)
    }
}

您可能需要在音高检测模块前面添加一个滤波器,以过滤除了您所感兴趣的频率之外的所有频率。您感兴趣的频率不一定是主导频率,除非它非常大声。 - Robert Harvey
谢谢您的建议。问题是在我听到它之前,我不知道我想要哪个频率。我基本上在“聆听”持续约3秒钟的音调或蜂鸣声。 - Bill
你可能会觉得值得研究倒谱分析 - Sami Hult
你可能想将采样率调高一些。你检测到的频率可能是由混叠引起的。 - yunzen
1个回答

1

您可能需要:

  • 使用噪声门效果来过滤音频源中的噪音(请查看noise-gate包)

  • 在处理之前使用压缩器和/或限制器来优化您的声音(请查看audio-object

进行音频信号处理之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接