在我正在開發的程序之一,消除回聲是一個大問題,其他開發人員已注意到在程序中有回聲漂移。要查看問題出在哪裏,我將代碼分開,並最終發現無論我做什麼,音頻都會在Node.js中漂移。音頻漂移當管道聲音在揚聲器在Node.js
步驟來重現
有一個.wav錄音使用進行採樣。
2.有一個錄音程序來記錄揚聲器的輸出,並將麥克風指向揚聲器直接錄音。
3.首先,使用普通的音頻播放器應用程序記錄正在播放的.wav。分析這兩個文件,並注意兩者中沒有音頻漂移。
4.在Node.js的
創建以下腳本var process = require('process');
var argv = require('minimist')(process.argv.slice(2));
var Speaker = require('speaker');
var fs = require('fs');
var wav = require('wav');
var wavReader = fs.createReadStream(String(argv._[ 0 ]))
.pipe(wav.Reader());
var buffer = null;
wavReader.on('format', function(format) {
console.log("Playing wav.", format);
wavReader.on('data', function(chunk) {
if(buffer)
buffer = Buffer.concat([ buffer, chunk ]);
else
buffer = chunk;
})
.on('end', function() {
new Speaker(format).write(buffer);
});
});
5.像以前一樣做同樣的記錄過程,但這個時間記錄Node.js的腳本的輸出。請注意錄音與原始文件中的音頻漂移。
這就是我在步驟5中執行上述操作時看到的內容。在我的屏幕截圖中,頂部是原始.wav文件,底部是在開頭正確對齊後的錄製版本。
我想可能是節點揚聲器模塊包,所以我決定使用aplay重新編寫代碼。
var process = require('process');
var argv = require('minimist')(process.argv.slice(2));
var fs = require('fs');
var wav = require('wav');
var spawn = require('child_process').spawn;
var wavReader = fs.createReadStream(String(argv._[ 0 ]))
.pipe(wav.Reader());
var buffer = null;
wavReader.on('format', function(format) {
console.log("Playing wav.", format);
var aplay = spawn('aplay', [
"-r", String(format.sampleRate),
"-c", String(format.channels),
"-f", "S16_LE"
]
);
wavReader.pipe(aplay.stdin);
});
然而,相同的音頻漂移出現在此代碼也。我希望這不是在Node.js中的限制,我不必切換到C++來解決這個問題。我的Node.js版本是v0.10.30。