在公司项目中,我们面临着需要使用微软的实时语音识别的挑战,因此我们深入研究了微软的官方SDK和API。项目中前端与Java的交互相对简单,通过HZRecorder采集实时音频流,将其处理成二进制,后端使用Netty和WebSocket接收消息。然而,微软的翻译部分却是我们遇到的难题之一。微软官方提供了几种翻译类型,包括一段音频片段的翻译以及硬件设备直接获取流做翻译。由于我们的服务需要在服务器上部署,第二种方式并不适用。在第一种情况下,微软的SpeechRecognizer对象能够接收一个特殊的流对象PullAudioStreamCallback作为数据源。然而,我们发现SpeechRecognizer在读取到流中0个字节后会停止识别,而默认的流类型无法满足我们的需求。当没有数据可读时,它们无法阻塞等待。为了解决这个问题,我们必须定义自己的音频流对象,以满足PullAudioStreamCallback的期望效果,即只有在明确流结束时,Read()方法才返回0。