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