Я использую следующий javascript для записи аудио и отправки его на сервер веб-сокетов:
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 в реальном времени, и сервер веб-сокетов отказался отправлять какие-либо ответы.Отладкой я проверил, что sampleRate не меняется на 8 кГц. При исследовании я обнаружил, что это известная ошибка как в chrome, так и в firefox.Я нашел некоторые другие ресурсы, такие как stackoverflow1 и IBM_STT , но я понятия не имею, как адаптировать его к моему коду.Вышеупомянутые полезные ресурсы относятся к буферу, но все, что у меня есть, это mediaStream (поток) и 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)