本想要通过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
个赞
请登录后评论
TOP
切换版块
原因:
百度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的概率
所以到底为什么SDK还要打开麦克风啊?楼主解决了吗?
您的意思是文件流作为麦克风输入吧?
看下demo中有麦克风作为inputStream的示例,