Java集成阿里云的实时语音识别遇到的一些问题

集成阿里云的实时语音识别遇到的问题:

困扰了一周时间,主要涉及到流的处理问题。

集成处理逻辑:

集成是通过引用maven依赖加载。

前端录音通过流的方式传到后端,后端再把流上传到Minio,后端拿到文件地址,调微服务(集成语音识别的是另一个独立的微服务)去Minio获取输入流,再上传到阿里云(公有云的服务)。然后监听返回识别的结果,最后返回结果文本给前端。

问题:

偶发性,,监听不到返回的结果就关闭了服务端。该音频是正常的,拿去官网下载的demo执行,是有监听到返回的结果。这时就很纳闷,多数在我集成的代码里是可以监听到结果的,少数没有监听到,一开始以为是音频问题,所以就去demo执行,验证音频,是没问题的。

解决:

最后叫同事一起帮忙对比代码debug,终于发现了,demo里切片上传的是文件输入流,但我的是直接上传的是从Minio获取到的输入流,,,重点是文件输入流和单单的输入流是有区别的。因为是偶发性,一直没留意这里。

区别:

InputStream不可以读取文件,它是一个抽象类,根本不可能实例化,是所有输入流的基类。而FileInputStream是InputStream的一个实现类,用于读取诸如图像数据之类的原始字节流。FileInputStream是读取一个文件来作InputStream,FileInputStream是字节流。

问题代码:


            //获取文件名
            String fileName = path.substring(path.lastIndexOf("/"));
            InputStream fis = MinioUtil.getMinioFile(MinioUtil.getBucketName(), fileName);


            byte[] b = new byte[6400];
            int len;
            while ((len = fis.read(b)) > 0) {
                logger.info("send data pack length: " + len);
                recognizer.send(b, len);
                // 8000采样率情况下,3200byte字节建议 sleep 200ms,16000采样率情况下,3200byte字节建议 sleep 100ms
                int deltaSleep = getSleepDelta(len, 8000);
               
            }

解决代码:


        //获取文件名
        String fileName = path.substring(path.lastIndexOf("/"));
        InputStream fis2 = MinioUtil.getMinioFile(MinioUtil.getBucketName(), fileName);
        //创建临时文件
        File file = File.createTempFile(IdWorker.getIdStr(),"");
        FileUtil.writeFromStream(fis2,file);
        FileInputStream fis = new FileInputStream(file);

        byte[] b = new byte[6400];
        int len;
        while ((len = fis.read(b)) > 0) {
            logger.info("send data pack length: " + len);
            transcriber.send(b, len);
            // 8000采样率情况下,3200byte字节建议 sleep 200ms,16000采样率情况下,3200byte字节建议 sleep 100ms
            int deltaSleep = getSleepDelta(len, 16000);
          
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值