公司在项目启动初期面临需要整合微软的实时语音识别服务的挑战,因此深入研究了微软提供的官方SDK和API。在前端与Java后端的交互过程中,前端页面通过HZRcorder实时采集音频流并将其处理成二进制数据,而后端则利用Netty和WebSocket进行消息接收。然而,项目的关键难题出现在微软的翻译功能上。微软官方提供了两种翻译类型,一种是基于音频片段的翻译,另一种是硬件设备直接获取流进行翻译。由于我们的服务需要在服务器上部署,第二种方式并不适用。在第一种情况下,使用微软的SpeechRecognizer对象需要接收一个特殊的流对象PullAudioStreamCallback作为数据源。然而,由于默认的流类型无法满足项目需求,存在一个问题,即SpeechRecognizer在流中读取到0个字节后会停止识别。在我们的场景中,需要流在明确结束时才返回0,但默认的流类型无法实现这一效果。因此,我们必须自定义音频流对象,以确保在流结束时才返回0,满足PullAudioStreamCallback的期望效果。