语音识别 POST返回汉字乱码问题?

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

用腾讯云 一句话识别 Java SDK 进行http连接时,返回汉字始终为乱码。

后将编码格式统一为utf-8后,识别结果却一直显示“嗯。嗯。嗯嗯嗯嗯嗯嗯“之类的,反正就只有“嗯,哦,啊”。

可是我的语音文件没有问题,在线测试是能准确识别的。应该还是Http连接过程中,哪里出现了问题,以至于收不到正确答案。

哪位大佬有遇到过类似问题,求解答。十分万分感谢!

附上代码:(主要内容集中在后半部分,从try{}开始,可以看到把各种字符集都设置为了UTF-8,但现在仍旧有未知问题。)

public static String sendVoice() {
        Map<String, String> reqMap = new TreeMap();
        reqMap.put("Action", "SentenceRecognition");
        reqMap.put("SecretId", SecretId);
        reqMap.put("Timestamp", toUNIXEpoch());
        reqMap.put("Nonce", toUNIXNonce());
        reqMap.put("Version", "2018-05-22");
        reqMap.put("ProjectId", "0");
        reqMap.put("SubServiceType", "2");
        reqMap.put("EngSerViceType", EngSerViceType);
        reqMap.put("SourceType", SourceType);
        if (SourceType.compareTo("0") == 0) {
            try {
                String Url = URLEncoder.encode(fileURI, "UTF-8");
                reqMap.put("Url", Url);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        } else if (SourceType.compareTo("1") == 0) {
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(new File(fileURI));
                int datalen = fileInputStream.available();
                byte[] dataPacket = new byte[datalen];
                int n = fileInputStream.read(dataPacket);
                //System.out.println("n :"+n);
                String Data = Base64.getEncoder().encodeToString(dataPacket);
                String DataLen = datalen + "";
                // System.out.println("data len: "+DataLen);
                reqMap.put("Data", Data);
                reqMap.put("DataLen", DataLen);


            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            return "-3";
        }
        reqMap.put("VoiceFormat", VoiceFormat);
        String UsrAudioKey = getRandomString(16);
        reqMap.put("UsrAudioKey", UsrAudioKey);
        String _url = "POSTaai.tencentcloudapi.com/?";
        String signstr = formSignstr(_url, reqMap);
        // System.out.println("signstr: " + signstr);
        String signing = createSign(signstr, SecretKey);
        // System.out.println("签名: " + signing);
        String tmppostdata = formPostbody(reqMap);
        String sign = "";
        try {
            sign = URLEncoder.encode(signing, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        StringBuilder postdata = new StringBuilder(tmppostdata);
        postdata.append("Signature=");
        postdata.append(sign);
        String post = postdata.toString();
        //System.out.println("post : "+post);
        String serverUrl = "https://aai.tencentcloudapi.com";

        HttpURLConnection con = null;
        StringBuilder sbResult = new StringBuilder();
        try {
            URL url = new URL(serverUrl);
            con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setUseCaches(false);
            con.setRequestProperty("Host", "aai.tencentcloudapi.com");
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setRequestProperty("Charset", "UTF-8");
            con.setRequestProperty("Accept-Charset", "UTF-8");
            con.setRequestProperty("contentType", "UTF-8");

            // 往服务器写入数据
            OutputStream out = con.getOutputStream();
            out.write(post.getBytes("UTF-8"));
            out.flush();

            // 接收服务器返回的数据
            InputStream in = con.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in,"UTF-8"));
            String line;// 每一行的数据
            while ((line = br.readLine()) != null) {
                sbResult.append(line);
            }
            System.out.println(sbResult.toString());
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (con != null) {
                con.disconnect();
                con = null;
            }
        }
        //return "0";
        //return new String (sbResult.toString().getBytes(),"GBK");
        return sbResult.toString();
    }
Cathy53Cathy53提问于
御姐万岁回答于

注意一下调用的音频格式,是否是8k 16bit wav或mp3

回答过的其他问题

代码部署会失败,提示 “代码部署失败 -40017:获取cos文件属性失败”?

你的cos文件属性配置好了吗?是怎么配置的呢?看你的报错信息应该是没有正确配置cos,你检查一下你的配置看一下,生产环境的部署办法看一下这里https://cloud.tencent.com/document/product/619/11689

Polar码 和LDPC码的区别?

Polar码是一类基于称为信道极化的现象的线性分组码。LDPC码是一种具有稀疏校验矩阵的分组纠错码,至于是什么就不在多言了,我想说的是,其实Polar码成为5G控制信道eMBB场景编码方案其实很好理解。并且是实有名归。 Polar编码对5G场景的适用性非常高,华为在5G现场试验中...... 展开详请

获取到的备份下载链接,失效(404),后从新刷新接口获取为什么刷新后的的地址没变 还是失效链接?

新建一个控制器却无法访问是什么原因呢?

点击右上角的【腾讯云】按钮,选择【上传测试代码】,勾选【普通上传】,点击确定上传代码,等到提示开发环境部署成功你这个是开发环境部署成功未部署成功导致的,不是你的代码问题,检查是否部署正确

哪里可以设置home/uftp访问权限为a-w?

登录到linux服务器,然后使用cd命令切换到home/uftp下,然后使用

chmod a-w uftp

就行了,很简单的

提示550错误,无法删除?

如果使用上面办法都没办法解决,而且是windows服务器的话,尝试一下操作: FileZilla因为是运行中SYSTEM权限下,而共享文件SYSTEM并没有这样的功能。 所以解决这个问题的办法就是在管理--服务中,对FIleZilla进行一个管理员权限的设置。使其在管理员下面运行...... 展开详请

扫码关注云+社区

领取腾讯云代金券