使用Java API调用Dialogflow CX获取意图检测的文本与音频响应
核心逻辑差异说明
Dialogflow CX 与 Dialogflow ES 的响应生成逻辑存在明确区别:默认同步意图检测请求不会自动生成文本转语音的音频输出,必须在请求构造阶段显式声明音频生成的相关配置,触发后端TTS流程,才会在响应中返回可直接播放的音频内容。
可直接落地的实现方案
关键配置要求
- 构造请求时,除了已有的会话标识、文本输入参数外,必须额外通过
QueryParameters传入OutputAudioConfig实例,这是CX服务端开启TTS音频生成的唯一触发开关 - 生成的二进制音频内容会挂载在
DetectIntentResponse的顶层outputAudio字段中,不会嵌套在文本响应消息内 - 若未在代码中自定义TTS语音参数,服务端会自动复用Dialogflow CX控制台中为智能体配置的默认语音人、语速、音量等参数,无需重复配置
完整实现示例
// 构造音频输出配置 OutputAudioConfig audioConfig = OutputAudioConfig.newBuilder() // 指定输出音频编码格式,LINEAR16为通用WAV格式,全平台兼容性最优 .setAudioEncoding(OutputAudioEncoding.LINEAR16) // 可选:如需覆盖控制台默认TTS配置,可在此处自定义语音人、语速等参数 .setSynthesizeSpeechConfig(SynthesizeSpeechConfig.newBuilder() .setVoice(VoiceSelectionParams.newBuilder() .setName("es-ES-Wavenet-A") .build()) .build()) .build(); // 构造查询参数,挂载音频输出配置 QueryParameters queryParameters = QueryParameters.newBuilder() .setOutputAudioConfig(audioConfig) .build(); // 构造用户输入参数,与原有逻辑保持一致 QueryInput queryInput = QueryInput .newBuilder() .setLanguageCode("es-ES") .setText("hola") .build(); // 构造检测请求,新增QueryParameters配置项 DetectIntentRequest request = DetectIntentRequest.newBuilder() .setSession(sessionName.toString()) .setQueryInput(queryInput) .setQueryParameters(queryParameters) .build(); DetectIntentResponse response = sessionsClient.detectIntent(request); // 取文本响应的逻辑与原有实现完全兼容 String textResult = response.getResponseMessages(0).getText().getText(0); // 提取二进制音频流 com.google.protobuf.ByteString audioStream = response.getOutputAudio(); // 转换为字节数组后可直接写入本地音频文件、或推送至前端播放 byte[] audioBytes = audioStream.toByteArray();
常见问题排查
- 原返回结果中
responseMessages数组末尾的空对象,是未开启音频输出时的预留占位字段,加入上述配置后该占位会自动消失 - 你当前使用的
google-cloud-dialogflow-cx 0.6.1版本已完整支持上述音频输出相关的API方法,无需升级依赖版本 - 注意区分输入、输出的音频配置:
AudioInput字段用于传入用户的语音流完成ASR识别,与本次需要的输出TTS音频无关联,无需额外配置
内容的提问来源于stack exchange,提问作者Centrix9
相关产品推荐
相关产品推荐

