【发布时间】:2019-03-19 22:53:54
【问题描述】:
我正在使用以下 javascript 来录制音频并将其发送到 websocket 服务器:
const recordAudio = () =>
new Promise(async resolve => {
const constraints = {
audio: {
sampleSize: 16,
channelCount: 1,
sampleRate: 8000
},
video: false
};
var mediaRecorder;
const stream = await navigator.mediaDevices.getUserMedia(constraints);
var options = {
audioBitsPerSecond: 128000,
mimeType: 'audio/webm;codecs=pcm'
};
mediaRecorder = new MediaRecorder(stream, options);
var track = stream.getAudioTracks()[0];
var constraints2 = track.getConstraints();
var settings = track.getSettings();
const audioChunks = [];
mediaRecorder.addEventListener("dataavailable", event => {
audioChunks.push(event.data);
webSocket.send(event.data);
});
const start = () => mediaRecorder.start(30);
const stop = () =>
new Promise(resolve => {
mediaRecorder.addEventListener("stop", () => {
const audioBlob = new Blob(audioChunks);
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
const play = () => audio.play();
resolve({
audioBlob,
audioUrl,
play
});
});
mediaRecorder.stop();
});
resolve({
start,
stop
});
});
这是用于实时 STT 并且 websocket 服务器拒绝发送任何响应。我通过调试检查 sampleRate 没有更改为 8Khz。经过研究,我发现这是 chrome 和 firefox 上的一个已知错误。我找到了一些其他资源,例如 stackoverflow1 和 IBM_STT,但我不知道如何将其适应我的代码。 上述有用的资源是指缓冲区,但我的代码中只有 mediaStream(stream) 和 event.data(blob)。 我是 javascript 和 Audio Api 的新手,所以如果我做错了什么,请原谅我。
如果这有帮助,我有一个等效的 python 代码将数据从麦克风发送到 websocket 服务器,它可以工作。使用的库 = Pyaudio。代码:
p = pyaudio.PyAudio()
stream = p.open(format="pyaudio.paInt16",
channels=1,
rate= 8000,
input=True,
frames_per_buffer=10)
print("* recording, please speak")
packet_size = int((30/1000)*8000) # normally 240 packets or 480 bytes
frames = []
#while True:
for i in range(0, 1000):
packet = stream.read(packet_size)
ws.send(packet, binary=True)
【问题讨论】:
标签: javascript audio-recording sample-rate