中国驻美大使谢锋:人工智能不能野蛮生长跑马圈地
2026-06-22
2026-06-26 0
Java调用讯飞听见实时语音转写API需满足音频格式、鉴权签名、WebSocket帧序三条件;须获取AppID/API Key/APISecret,构造带HMAC-SHA256签名的wss URL,发送含language/aue/auf等字段的启动帧,按1280字节PCM帧长采集并推送音频,最后发结束帧。

用Java调用讯飞听见实时语音转写API,实现麦克风语音流边录边转、低延迟返回文字结果,必须严格满足音频格式、鉴权签名、WebSocket帧序三个硬性条件,缺一不可。
访问讯飞开放平台官网(https://www.xfyun.cn),完成企业实名认证并登录控制台。
在“我的应用”中创建新应用,服务类型选择【实时语音转写】,开通后记录下【AppID、API Key、APISecret】三项——后续所有签名计算都依赖这组密钥,丢失需重新生成且旧密钥立即失效。
确认本地JDK版本≥1.8,使用Maven管理依赖,在pom.xml中添加:
讯飞要求每次WebSocket连接前,必须生成带时间戳和HMAC-SHA256签名的wss地址,不能直接拼接固定域名。
第一步:拼接原始参数字符串,格式为host=rtasr.xfyun.cn&date=RFC1123格式时间&algorithm=hmac-sha256&headers=host&signature=base64(hmac-sha256(密钥, 签名内容)),其中date必须是GMT时区,误差超过15分钟即拒绝连接。
第二步:对完整参数串做URL编码,再组合成最终URL:wss://rtasr.xfyun.cn/v1/ws?host=rtasr.xfyun.cn&date=...&signature=...
注意:签名密钥由API Key + API Secret拼接生成,不是单独使用任一字段——填错任意一个字符都会导致403 Forbidden错误,且无具体提示。
方法一:使用Java-WebSocket库创建客户端,重写onOpen()回调,在连接就绪后立即发送JSON启动帧。
启动帧必须包含language(如zh_cn)、accent(如mandarin)、aue(pcm为raw)、auf(audio/L16;rate=16000)等字段,缺省值不会自动补全,漏填会导致连接后秒断。
方法二:在onOpen()中调用send()发送以下JSON:
{"common":{"app_id":"你的AppID"},"business":{"language":"zh_cn","accent":"mandarin","domain":"iat","aue":"raw","auf":"audio/L16;rate=16000","ent":"general"},"data":{"status":0,"format":"audio","encoding":"raw","sample_rate":16000,"channel":1,"bit_depth":16}}
这一步必须在WebSocket状态变为OPEN后立刻执行,延迟超过3秒服务器将主动关闭连接。
第一步:用javax.sound.sampled.AudioSystem获取目标混音器,设置音频格式为16kHz/16bit/单声道LINEAR,打开TargetDataLine。
第二步:以40ms为单位读取音频缓冲区——16kHz × 16bit × 1ch × 0.04s = 【1280字节】,这是讯飞强制要求的帧长,多1字节或少1字节都会触发frame error并中断会话。
第三步:每读满1280字节,立即通过WebSocket.send()推送二进制数据帧;最后一帧不足1280字节时,必须补零填充至该长度,否则识别结果截断。
第四步:全部音频发送完毕后,发送结束帧:{"data":{"status":2}},通知服务端停止识别并返回最终结果。