Speech recognition 实时(近)Watson语音到文本,用于使用Javascript和Java websockets转录麦克风音频字节

Speech recognition 实时(近)Watson语音到文本,用于使用Javascript和Java websockets转录麦克风音频字节,speech-recognition,ibm-watson,speech-to-text,embedded-jetty,java-websocket,Speech Recognition,Ibm Watson,Speech To Text,Embedded Jetty,Java Websocket,我试图使用浏览器麦克风支持从Javascript调用Watson语音到文本服务,Java后端使用Jetty websockets实现。我正在使用Watson Speech to text Java SDK进行服务连接 Maven依赖关系 <dependency> <groupId>com.ibm.watson</groupId> <artifactId>speech-to-text</artifactId> &l

我试图使用浏览器麦克风支持从Javascript调用Watson语音到文本服务,Java后端使用Jetty websockets实现。我正在使用Watson Speech to text Java SDK进行服务连接

Maven依赖关系

<dependency>
    <groupId>com.ibm.watson</groupId>
    <artifactId>speech-to-text</artifactId>
    <version>7.3.0</version>
</dependency>
HTML


提供头衔
var uri=”wss://localhost:8442/transcribe";
var-websocket=null;
var message=“”;
函数openConnection(){
websocket=新的websocket(uri);
//websocket.binaryType=“arraybuffer”;
websocket.onmessage=函数(事件){
var node=document.getElementById('fromServer');
var newNode=document.createElement('h1');
if(事件数据){
appendChild(文档)。
createTextNode(event.data));
appendChild(newNode);
}
否则{
appendChild(文档)。
createTextNode(“上传图像”);
appendChild(newNode);
}
};
}
函数closeConnection(){
websocket.close();
}
函数sendMessage(){
var msg=document.getElementById('messageText')。值;
websocket.send(msg);
}
函数sendFile(){
var file=document.getElementById('filename')。文件[0];
var reader=new FileReader();
var rawData=new ArrayBuffer();
reader.loadend=函数(){}
reader.onload=函数(e){
rawData=e.target.result;
websocket.binaryType=“arraybuffer”;
发送(原始数据);
警报(“文件已被传输。”)
}
reader.readAsArrayBuffer(文件);
}
客户端消息:

客户端上载:

使用上述代码,当从麦克风讲话时,音频字节将成功发送到后端。但当数据发送到Watson STT时,返回的响应为空,如下所示:

**答复:** { “结果”:[], “结果索引”:0 }

这向我表明,要么字节编码不正确,要么用于音频标准化的配置不正确

如果尝试使用此配置,会出现以下错误:

Java:

this.recognizeOptions=new recognizeOptions.Builder()
.音频(流)
.contentType(“音频/l16;速率=48000”)
.模型(“en-US_宽带模型”)
.interimResults(真)
.build();
严重:在8192字节的数据流中查看尾部0非零字节字符串后,无法检测到endianness。ByTestStream真的是PCM数据吗? java.lang.RuntimeException:在查看8192字节的数据流中尾部0非零字节字符串后,无法检测endianness。ByTestStream真的是PCM数据吗?在com.ibm.watson.speech_to_text.v1.websocket.SpeechToTextWebSocketListener.onMessage(SpeechToTextWebSocketListener.java:128)

上述错误来自Watson STT SDK,表明音频字节传输到STT服务API的方式存在问题

我尝试过不同的配置变化,比如改变采样率、语音模型,但似乎没有任何效果。同样的配置似乎与谷歌语音文本完美配合,我在回复中得到了成绩单。我参考了下面谷歌教程中提供的示例。

请帮助解决此问题,并建议解决方案。

根据:

该服务自动检测传入音频的终止性

不知道为什么在您的情况下它会失败,但是您可以通过将endianness添加到内容类型中来明确设置endianness:
audio/l16;费率=48000;endianness=小endian

更新关于您的示例文件:

这些是您提供的文件的参数

$ soxi /run/shm/8_Channel_ID.wav 

Input File     : '/run/shm/8_Channel_ID.wav'
Channels       : 8
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:08.05 = 386383 samples ~ 603.723 CDDA sectors
File Size      : 9.27M
Bit Rate       : 9.22M
Sample Encoding: 24-bit Signed Integer PCM
这就是我们应该做的

$ soxi /run/shm/16bit_test.wav 

Input File     : '/run/shm/16bit_test.wav'
Channels       : 1
Sample Rate    : 48000
Precision      : 16-bit
Duration       : 00:00:01.50 = 72000 samples ~ 112.5 CDDA sectors
File Size      : 144k
Bit Rate       : 768k
Sample Encoding: 16-bit Signed Integer PCM
您的文件有24位样本,而Whatson需要16位。您的文件的频道数为8个-虽然据说Watson将多频道音频下混音到一个频道,但我仍然会尝试先手动转换。

Per:

该服务自动检测传入音频的终止性

不知道为什么在您的情况下它会失败,但是您可以通过将endianness添加到内容类型中来明确设置endianness:
audio/l16;费率=48000;endianness=小endian

更新关于您的示例文件:

这些是您提供的文件的参数

$ soxi /run/shm/8_Channel_ID.wav 

Input File     : '/run/shm/8_Channel_ID.wav'
Channels       : 8
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:08.05 = 386383 samples ~ 603.723 CDDA sectors
File Size      : 9.27M
Bit Rate       : 9.22M
Sample Encoding: 24-bit Signed Integer PCM
这就是我们应该做的

$ soxi /run/shm/16bit_test.wav 

Input File     : '/run/shm/16bit_test.wav'
Channels       : 1
Sample Rate    : 48000
Precision      : 16-bit
Duration       : 00:00:01.50 = 72000 samples ~ 112.5 CDDA sectors
File Size      : 144k
Bit Rate       : 768k
Sample Encoding: 16-bit Signed Integer PCM

您的文件有24位样本,而Whatson需要16位。您的文件的频道数是8个-虽然据说Watson将多频道音频下混到一个频道,但我还是会先尝试手动转换。

对,我尝试将endianness显式设置为little endian和big endian,但都不起作用。显式设置endianness后的错误消息是什么?设置endianness后我没有收到错误消息。但是,正如问题中提到的,响应是空的。请尝试在没有JavaScript部分的情况下运行Java代码。例如,直接使用
FileInputStream
,看看是否有效。如果是这样,问题在于Java和JS之间的数据传输。我的意思是,我已经发送了字节格式的.wav文件。问题似乎在于数据发送方式与Watson STT预期的不同。可能有关系