我想用nodejs和googlespeech-to-text api制作一个实时转录应用程序。
我正在使用RecordRTC和socket。io将音频块获取到后端服务器。目前,我正在录制1秒长的块,并且转录工作正常,但它没有将其视为流,而是在处理每个块后发送响应。这意味着我要收回半句话,谷歌无法利用上下文帮助自己识别演讲。
我的问题是,如何让谷歌将我的块视为一个连续的流。或者是否有其他解决方案可以达到相同的结果?(正在现场录制麦克风音频,或非常接近现场)。
谷歌在他们的网站上有一个演示,它完全符合我的要求,所以应该可以做到这一点。
我的代码:(主要来自selfservicekiosk音频流媒体回购)
ss是插座。io流
服务器端
io.on("connect", (socket) => {
socket.on("create-room", (data, cb) => createRoom(socket, data, cb))
socket.on("disconnecting", () => exitFromRoom(socket))
// getting the stream, it gets called every 1s with a blob
ss(socket).on("stream-speech", async function (stream: any, data: any) {
const filename = path.basename("stream.wav")
const writeStream = fs.createWriteStream(filename)
stream.pipe(writeStream)
speech.speechStreamToText(
stream,
async function (transcribeObj: any) {
socket.emit("transcript", transcribeObj.transcript)
}
)
})
async speechStreamToText(stream: any, cb: Function) {
sttRequest.config.languageCode = "en-US"
sttRequest = {
config: {
sampleRateHertz: 16000,
encoding: "WEBM_OPUS",
enableAutomaticPunctuation: true,
},
singleUtterance: false,
}
const stt = speechToText.SpeechClient()
//setup the stt stream
const recognizeStream = stt
.streamingRecognize(sttRequest)
.on("data", function (data: any) {
//this gets called every second and I get transciption chunks which usually have close to no sense
console.log(data.results[0].alternatives)
})
.on("error", (e: any) => {
console.log(e)
})
.on("end", () => {
//this gets called every second.
console.log("on end")
})
stream.pipe(recognizeStream)
stream.on("end", function () {
console.log("socket.io stream ended")
})
}
const sendBinaryStream = (blob: Blob) => {
const stream = ss.createStream()
ss(socket).emit("stream-speech", stream, {
name: "_temp/stream.wav",
size: blob.size,
})
ss.createBlobReadStream(blob).pipe(stream)
}
useEffect(() => {
let recorder: any
if (activeChat) {
navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then((stream) => {
streamRef.current = stream
recorder = new RecordRTC(stream, {
type: "audio",
mimeType: "audio/webm",
sampleRate: 44100,
desiredSampleRate: 16000,
timeSlice: 1000,
numberOfAudioChannels: 1,
recorderType: StereoAudioRecorder,
ondataavailable(blob: Blob) {
sendBinaryStream(blob)
},
})
recorder.startRecording()
})
}
return () => {
recorder?.stopRecording()
streamRef.current?.getTracks().forEach((track) => track.stop())
}
}, [])
感谢您的帮助!
我有完全相同的问题!
也许谷歌的演示是使用node-rece-lpcm16与SoX:https://cloud.google.com/speech-to-text/docs/streaming-recognize?hl=en
我正在使用spyder IDE进行我的语音到文本转换项目,该项目使用谷歌语音到文本api。我在代码中集成了谷歌语音和文本,出现了类似“配额耗尽”的错误。在谷歌控制台的仪表板上,我可以看到可用的配额。 > 错误 文件"C:\Program Data\Anaconda3\lib\site-包\speech_recognition__init__. py",第932行,在recognize_google
我正在使用谷歌云语音到文本AP,并试图转录长音频文件。但是,无法检测到桶中的音频文件。我得到一个错误,说明:IOError:[Errno 2]没有这样的文件或目录: transcribe_gcs(gcs_uri):
Android谷歌语音转文本SDK,语音录制由SDK控制。我需要将其设置为手动按钮,用于启动和停止语音录制,以便将语音转换为文本。例如:当单击按钮开始语音识别时,它会继续录制音频,直到单击停止按钮。但在android SDK中,它会自动停止录制并将录制的音频传递给处理。
我正在尝试从扬声器转录音频 我正在将声音从扬声器传送到节点。js文件(https://askubuntu.com/a/850174) 这是我的抄本。js公司 但谷歌云语音到文本在1分钟内对流媒体识别有一个限制。所以我有一个错误“超过了允许的最大流持续时间65秒” 如何将流拆分为以静默为拆分器的块,或拆分为持续30秒的块?
我能够使用链接中包含的教程转录音频(https://cloud.google.com/speech-to-text/docs/async-recognize),但它仅适用于WAV格式的音频。我想让它与MP3或M4A格式的音频一起工作。 我已经测试了链接中包含的所有可能性(https://github.com/GoogleCloudPlatform/java-docs-samples/blob/ma
我正在努力寻找使用谷歌云语音API进行实时连续语音识别的例子。我的要求是使用麦克风,检测语音,并在用户说话时进行转录。 我知道他们的RESTAPI没有这种支持,所以我研究了grpc示例,包括他们提供的示例。但它们似乎都是用户可以上传音频并检测语音的例子。 我在Java,谷歌grpc也支持java。有人遇到一个很好的例子,展示了如何通过麦克风持续进行这种识别吗?