12 votes

Trouver la fréquence audio la plus dominante dans l'échantillon

J'essaie de créer un projet qui tire un fichier audio en direct d'Internet et échantillonne continuellement l'audio à la recherche de la fréquence la plus dominante pour une période donnée. L'idée est que s'il détecte une fréquence de, disons, 440 Hz sur une période donnée (quelques secondes), cela signifie qu'un son particulier a été joué dans le flux audio en direct. Une fois qu'il aura détecté un son particulier, je lui ferai faire d'autres choses dans le programme. Le flux en direct est soit une conversation, soit une tonalité unique, soit un silence.

J'ai réussi à le faire et j'ai obtenu une preuve de concept en lisant un fichier que j'ai généré à partir d'un générateur de sons en ligne. Lorsque je passe ce fichier, il identifie correctement la fréquence (elle n'est décalée que de 1 ou 2 Hz). Lorsque je passe le flux en direct, j'obtiens des données de fréquence qui sont quelque chose comme : 17704Hz. Je pense que cela provient du "bruit" du flux en direct.

J'utilise le npm modules node-pitchfinder y audio-analyer pour effectuer la plupart des traitements

Des idées sur la façon d'obtenir un seul son ?

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)
    }
}

1voto

A STEFANI Points 261

Vous pouvez en avoir besoin :

  • Appliquez un effet de réduction du bruit pour filtrer le bruit de la source audio (consultez la page barrière anti-bruit paquet)

  • Utilisez un compresseur et/ou un limiteur pour optimiser votre son avant le traitement (jetez un œil à objet audio

Avant le traitement du signal audio.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X