集成阿里云的實時語音識別遇到的問題:
困擾了一周時間,主要涉及到流的處理問題。
集成處理邏輯:
集成是通過引用maven依賴加載。
前端錄音通過流的方式傳到后端,后端再把流上傳到Minio,后端拿到文件地址,調(diào)微服務(wù)(集成語音識別的是另一個獨立的微服務(wù))去Minio獲取輸入流,再上傳到阿里云(公有云的服務(wù))。然后監(jiān)聽返回識別的結(jié)果,最后返回結(jié)果文本給前端。
問題:
偶發(fā)性,,監(jiān)聽不到返回的結(jié)果就關(guān)閉了服務(wù)端。該音頻是正常的,拿去官網(wǎng)下載的demo執(zhí)行,是有監(jiān)聽到返回的結(jié)果。這時就很納悶,多數(shù)在我集成的代碼里是可以監(jiān)聽到結(jié)果的,少數(shù)沒有監(jiān)聽到,一開始以為是音頻問題,所以就去demo執(zhí)行,驗證音頻,是沒問題的。
解決:
最后叫同事一起幫忙對比代碼debug,終于發(fā)現(xiàn)了,demo里切片上傳的是文件輸入流,但我的是直接上傳的是從Minio獲取到的輸入流,,,重點是文件輸入流和單單的輸入流是有區(qū)別的。因為是偶發(fā)性,一直沒留意這里。文章來源:http://www.zghlxwxcb.cn/news/detail-786269.html
區(qū)別:
InputStream不可以讀取文件,它是一個抽象類,根本不可能實例化,是所有輸入流的基類。而FileInputStream是InputStream的一個實現(xiàn)類,用于讀取諸如圖像數(shù)據(jù)之類的原始字節(jié)流。FileInputStream是讀取一個文件來作InputStream,F(xiàn)ileInputStream是字節(jié)流。文章來源地址http://www.zghlxwxcb.cn/news/detail-786269.html
問題代碼:
//獲取文件名
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字節(jié)建議 sleep 200ms,16000采樣率情況下,3200byte字節(jié)建議 sleep 100ms
int deltaSleep = getSleepDelta(len, 8000);
}
解決代碼:
//獲取文件名
String fileName = path.substring(path.lastIndexOf("/"));
InputStream fis2 = MinioUtil.getMinioFile(MinioUtil.getBucketName(), fileName);
//創(chuàng)建臨時文件
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字節(jié)建議 sleep 200ms,16000采樣率情況下,3200byte字節(jié)建議 sleep 100ms
int deltaSleep = getSleepDelta(len, 16000);
}
到了這里,關(guān)于Java集成阿里云的實時語音識別遇到的一些問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!