[英]convert audio file to Linear PCM 16-bit
我正在尝试通过 websocket 发送音频文件,我意识到为此我需要将 mp3 文件转换为线性 PCM 16 位代码,但我找不到这样做的方法。
这是我想做的:
let mp3File = // the 16-bit pcm file
ws.on('message', async(msg) => {
if (typeof msg === "string") {
} else if (recognizeStream) {
recognizeStream.write(msg);
}
ws.send(mp3File) <== stream back the audio file
});
});
一些背景,stream 是一个电话(通过 vonage api)所以 ny ws 连接到电话并听到用户输入,然后在我的服务器上进行一些逻辑之后,我想向用户播放一个本地文件的 mp3 文件在我的服务器中,通过 ws.send()。
- - - - - -更新 - - - -
现在,如果我从 stream 发送 pcm 数据(来自电话的原始音频)它的工作原理(服务器回显电话)所以我想将 mp3 文件转换为相同的格式,以便我可以通过 ws 发送它。发送()。
------------更新2--------
在以正确的格式制作我的音频文件后:“Linear PCM 16-bit, with a 8kHz or a 16kHz sample rate, and a 20ms frame size”
我正在尝试通过 web 套接字发送文件但我不知道该怎么做任何事物。
首先让我们了解这意味着什么:
线性 PCM 16 位,采样率为 8kHz 或 16kHz,帧大小为 20ms
他们在这里谈论两件事:
根据音频格式,如果选择“16bit Linear PCM with sample rate of 16K”意味着:
因此 1 秒的音频块将包含字节 = (16000 * 2) = 32000 字节,这意味着 20 毫秒/0.02 秒的音频帧将相当于 (32000*0.2) = 640 字节
需要做两件事:
将mp3转换为wav。 在您的系统上安装 ffmpeg 并运行此命令ffmpeg -i filename.mp3 -ar 16000 -sample_fmt s16 output.wav
这会将您的filename.mp3
转换为output.wav
,这将是 16K 采样率的线性 PCM 16 位
在您的代码中,当您发回音频时,您需要将stream 作为 640 字节的块,而不是一次性发送整个文件数据。 有 3 个选项:
我正在使用 npm websocket
package 编写此示例。
var fs = require('fs');
var binaryData = fs.readFileSync('output.wav');
var start = 44 // discard the wav header
var chunkSize = 640
...
// ws is a websocket connection object
connection.on('message', function(message) {
if (message.type === 'utf8') {
// handle a text message here
}
else if (message.type === 'binary') {
// print length of audio sent by nexmo. will be 640 for 16K and 320 for 8K
console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
if (start >= binaryData.length) {
// slice a chunk and send
toSend = binaryData.slice(start, start + chunkSize)
start = start + chunkSize
connection.sendBytes(toSend);
console.log('Sent Binary Message of ' + toSend.length + ' bytes');
}
} ...
});
请记住,从您将音频从服务器发送到 nexmo 到您在另一端收听的时间点会有一些延迟。 根据 Nexmo 数据中心的位置、运行代码的服务器的位置、网络速度等,它可以从半秒到更多。我观察到它接近 0.5 秒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.