gpt4 book ai didi

node.js - 如何使用从浏览器发送到Nodejs服务器的Blob进行Google语音文本转换

转载 作者:行者123 更新时间:2023-12-02 00:52:33 26 4
gpt4 key购买 nike

我试图将服务器设置为使用SocketIO从客户端浏览器接收音频,然后通过Google语音转文本处理它,最后用文本回复给客户端。

最初且理想情况下,我想设置为类似于此页面上的工具的功能:https://cloud.google.com/speech-to-text/

我尝试使用getUserMedia并通过SocketIO-Stream对其进行流传输,但是我不知道如何“管道传输” MediaStream

相反,现在我决定在客户端使用MediaRecorder,然后将数据作为blob一起发送(在example中看到)。

然后,我将toString('base64')应用于Blob,并在Blob上调用google-cloud/speech的client.recognize()

客户端(我正在使用VueJS):

        new Vue({
el: '#app',
data: function () {
return ({
msgs: [],
socket: null,
recorder: null,
: []
})
},
mounted: function () {
this.socket = io.connect('localhost:3000/user');
console.log('Connected!')
this.socket.on('text', function (text) {
this.msgs.push(text)
})
},
methods: {
startRecording: function () {
if (this.recorder && this.recorder.state == 'recording') {
console.log("Stopping!")
this.recorder.stop()
} else {
console.log("Starting!")
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(this.handleSuccess);
}
},
handleSuccess: function (stream) {
this.recorder = new MediaRecorder(stream)
this.recorder.start(10000)
this.recorder.ondataavailable = (e) => {
this.chunks.push(e.data)
console.log(e.data)
}
this.recorder.onstop = (e) => {
const blob = new Blob(this.chunks, { 'type': 'audio/webm; codecs=opus' })
this.socket.emit('audio', blob)
}
}
}
})

服务器端:

const speech = require('@google-cloud/speech');
const client = new speech.SpeechClient();

const io = require('socket.io').listen(3000)
const ss = require('socket.io-stream')

const encoding = 'LINEAR16';
const sampleRateHertz = 16000;
const languageCode = 'en-US';

const audio = {
content: null
}

const config = {
encoding: encoding,
sampleRateHertz: sampleRateHertz,
languageCode: languageCode,
}

async function main() {
const [response] = await client.recognize({
audio: audio,
config: config
})
const transcription = response.results
.map(result => result.alternatives[0].transcript)
.join('\n');
console.log(`Transcription: ${transcription}`);
}

io.of('/user').on('connection', function (socket) {
console.log('Connection made!')
socket.on('audio', function (data) {
audio.content = data.toString('base64')
main().catch(console.error)
});
});





服务器端 main()函数的日志始终为:

"Transcription: "



-这是空的!

它应包含发送的音频中的文本。
先感谢您!

最佳答案

您的nodejs应用程序要求处理原始音频数据,这些音频数据记录为16位带符号整数('LINEAR16')的数组,速率为16k个样本/秒(16000)。由于古代电话知识中丢失的原因,这种音频表示形式被称为pulse-code modulation (PCM)
但是您从客户端代码发送的Blob并非如此。这是具有内容类型audio/webm; codecs=opus的媒体对象。这意味着将使用Opus codecboxed (multiplexed) in the webm (Matroska, ebml) container format压缩音轨。云文本到语音代码尝试将其解释为原始音频数据,但失败,举起手并返回空的转录字符串。这类似于尝试在文本编辑器中查看zip文件:这只是胡言乱语。
若要使语音转换为媒体对象,您必须首先从中提取PCM音频。这是在服务器上安装颈部的一个臭名昭著的痛苦。您必须使用ffmpeg。有一个tutorial on it in the text-to-speech documentation。本教程提到了从视频文件中刮除音频。基本上,您的Blob是一个视频文件,其中没有视频轨道,因此可以使用相同的技术。
但是,使用MediaStream browser javascript APIs返回您的第一种方法会更好。特别是,您的浏览器代码应使用Web Audio API的元素来拦截原始PCM音频数据,并将其发送到您的服务器,或直接从浏览器发送到文本到语音。
解释所有这些超出了StackOverflow答案的范围。这里有一些提示。 How to use web audio api to get raw pcm audio?

关于node.js - 如何使用从浏览器发送到Nodejs服务器的Blob进行Google语音文本转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56453937/

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