audioRecord实时录音处理音频流后asr
uana_001 发布于2018-03 浏览:4694 回复:4
0
收藏

本想要通过AudioRecord进行实时录音,然后通过audioRecord.read()方法实时的获取到音频数据,然后自己对语音数据进行降噪和增益处理,然后在通过sdk实时的进行asr或者nlu处理,于是去测试是否可行,然后在自定义的AudioInputStream(继承自 InputStream)里面写了如下的代码:

@Override
    public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {

        if (firstRead == -1) {
            firstRead = System.currentTimeMillis();
        }
        long limit = (long) ((System.currentTimeMillis() - firstRead) * 32 * SPEED);
        long count = Math.min((limit - returnCount), byteCount);
        if (count <= 0) {
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 0;
        } else {
//            int r = in.read(buffer, byteOffset, (int) count);
            int r = audioRecord.read(buffer, byteOffset, buffer.length);
            Log.d("AudioStream", "r = " + r);
            if (r >= 0) {
                returnCount += r;
            }

            return r;
        }
    }

然后使用asr:

Map audioparams = new HashMap<>();
        audioparams.put(SpeechConstant.IN_FILE,
                "#com.baidu.android.voicedemo.recognization.online.InFileStream.createAudioStream()");
        Log.i(TAG, "createAudioStream");
        String json = new JSONObject(audioparams).toString();
        Log.i(TAG, runningTestName + " ," + json);
        asr.send(SpeechConstant.ASR_START, json, null, 0, 0);

本以为这样应该是可行的,因为看到也有通过麦克风阵列获取音频数据的。但是在运行时候发现,并不能实时的进行asr;反而报了如下的错误:

通过查看errCode,发现是 2005:下行网络读取失败   3001:麦克风打开失败。有一点我不太明白,为什么我通过InputStream的方式,sdk还要去打开麦克风??

还有就是麻烦问一下,我通过自己调用audioRecord.start();  --> audioRecord.read(); 然后自己预处理一下音频数据(降噪、增益等),然后把我实时处理的音频数据传给sdk进行asr等操作是否可行??

 

 

收藏
点赞
0
个赞
共4条回复 最后由常熟X小王182回复于2022-12
#5138*****574回复于2021-08

原因:
百度SDK错误使用了localserversocket
录音 -> 通过localserversocket上传服务器 -> localserversocket 异常 -> java.ioi.IOExceptiion: Address already in use

priivate fiinal static String SOCKET_ADDRESS = UUID.randomUUID().toString();
......
int address = new Random().nextIInt(1000);
mServerSocket = new LocalServerSocket(SOCKET_ADDRESS + address);

千分之一的概率出现占用问题, 而不是期望的UUID的概率

1
#4Jackz314回复于2019-01

所以到底为什么SDK还要打开麦克风啊?楼主解决了吗?

0
#3uana_001回复于2018-03
#2 fujiayi1984回复
看下demo中有麦克风作为inputStream的示例,

您的意思是文件流作为麦克风输入吧?

0
#2fujiayi1984回复于2018-03

看下demo中有麦克风作为inputStream的示例,

0
TOP
切换版块