Java调用微软认知服务TTS接口提交SSML返回8004507A解析错误问题
问题根因
你遇到的8004507A错误代表SSML解析失败,核心问题出在StringEntity的默认编码配置:
Apache HttpClient的StringEntity无指定编码的构造方法默认使用ISO-8859-1编码,你提交的SSML中phoneme标签的IPA音标təˈmeɪtoʊ包含大量非ASCII字符,用该编码传输会出现乱码,导致微软TTS服务端无法正常解析SSML。Postman提交raw格式请求时默认使用UTF-8编码,因此不会出现该问题。
修复方案
仅需修改StringEntity的构造参数,显式指定UTF-8编码即可,修改后的代码如下:
HttpPost httpPost = new HttpPost("https://eastus.tts.speech.microsoft.com/cognitiveservices/v1"); // 显式指定字符串编码为UTF-8,避免特殊字符乱码 httpPost.setEntity(new StringEntity(xml, java.nio.charset.StandardCharsets.UTF_8)); // 也可在Content-Type头中补充编码声明,进一步兼容服务端解析 httpPost.addHeader("Content-Type", "application/ssml+xml; charset=utf-8"); httpPost.addHeader("Ocp-Apim-Subscription-Key", key); httpPost.addHeader("X-Microsoft-OutputFormat", "audio-48khz-192kbitrate-mono-mp3"); org.apache.http.HttpResponse resp = httpclient.execute(httpPost);
如果你的Java版本低于7,不支持StandardCharsets.UTF_8,可以替换为字符串形式的编码声明:new StringEntity(xml, "UTF-8")。
内容的提问来源于stack exchange,提问作者Luke Voelk
相关产品推荐
相关产品推荐

