gpt4 book ai didi

javascript - 在 Node.js 中将声音传送到扬声器时的音频漂移

转载 作者:行者123 更新时间:2023-12-03 02:00:09 25 4
gpt4 key购买 nike

在我正在开发的一个程序中,消除回声很重要,其他开发人员注意到程序中有回声漂移。为了查看问题出在哪里,我撕开了代码,最后发现无论我做什么,音频都会在 Node.js 中漂移。

重现步骤

1. 有一个 .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 文件,底部是开始时正确对齐后的录制版本。
Audio Drift

我想可能是node-speaker模块包,所以我决定用aplay for alsa重写代码。
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。

最佳答案

我在 C 中用 alas 测试了相同的功能。结果发现这个问题只发生在播放 8000Hz 音频时。我想也许我的声卡在必须重新采样时表现不佳。我在另一台电脑上试过同样的功能,没有漂移。所以这毕竟不是 Node.js 的问题。

关于javascript - 在 Node.js 中将声音传送到扬声器时的音频漂移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32353793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com