uniapp呼叫百度語音實現錄音轉文字功能
經歷三天時間各種遇到困難 之後終於實現了這個功能,參照網上了許多文章 才找到一個能正常實現的方法,網上能找到的例子都不起作用,相信很多人困惑在這,為了避免別人出現這種情況,我分享我的程式碼,絕對可用,包括 uniapp前端使用了recorderManager和端呼叫百度語音轉文字,我相信很多人都很需要我寫的東西,我只試驗了安卓手機,html5 + 裡面
plus.speech這個方式就不要用了,不好用,呼叫百度的語音識別時在百度的管理控制檯會看到dev_id這個引數沒傳的錯誤也沒找到新增這個引數的地方,所以在hbuildx裡面當前專案的app模組配置這個地方不需要選
1.非常重要的一個步驟 manifest.on裡面新增.permission.RECORD_AUDIO這個許可權,無論是想真機除錯,由其是使用了自定義基座一定要線上打個包,讓基座包含這個許可權然後在手機系統 裡面應用管理當前這個app的許可權管理裡面必須要看到有錄音許可權這一項
2.為了能夠在使用recorderManager在進入要使用錄音功能的頁面會詢問是否允許錄音這樣的許可權,必須要使用recorderManager之前要呼叫一次硬體許可權申請。這個在外掛市場裡面有一個https://ext.dcloud.net.cn/plugin?id=594 這個地址 App許可權判斷和提示這樣的js,用於判斷或申請某個硬體許可權使用的是native.js的功能。這個外掛引入專案之後會在當前專案目錄的js_sdk這樣一個資料夾。在裡面會出現wa-permission檔案 夾下面會有一個permission.js,
3.相關程式碼
uniapp端程式碼
<view class="popup-content" > <view>{{msg}}</view> <view>你在說{{voicetext}}</view> <button class="uni-btn" type="warn" @touchstart="startvoice" @touchend="endvoice">按說語話鬆開停止</button> <button class="uni-btn" type="warn" @tap="playvoice" >播放錄音</button> </view> <script> import permision from "@/js_sdk/wa-permission/permission.js" const recorderManager = uni.getRecorderManager(); const innerAudioContext = uni.createInnerAudioContext(); export default { data() { return { voicetext:"",msg:"",voicepath:"" } },onLoad() { this.initaudio() },methods: { async initaudio(){ //注意此處必須為 await 因為會觸發非同步事件,手機上會彈出許可權申請對話方塊處理完才能走下一步錄音 let recordauth = await permision.requestAndroidPermission("android.permission.RECORD_AUDIO") http://www.cppcns.comconsole.log("判斷有沒有錄音許可權>>>>>>"+recordauth) if(recordauth==1){ recorderManager.onStart((res)=>{ console.log("開始 錄音>>>>>>>>>...") }); recorderManager.onStop((res)=>{ console.log("recorderstop....res.tempFilePath>>>"+res.tempFilePath) this.voicepath = res.tempFilePath this.uploadvoicefile()// 使用uni.uploadFile上傳到伺服器上,此時是mp3格式 }); recorderManager.onError( (res)=> { console.log('onError'+JSON.stringify(res)); }); } },//initaudio 方法結束 startvoice(){ console.log("開始錄音") recorderManager.start({ format:"mp3",sampleRate: 16000 // 必須設定是後臺設定的引數,不然百度語音識別不了 }); },endvoice(){ console.log("結束錄音") //注意為了避免說話時間太短導致這個api出現bug要加一些延時 setTimeout(()=>{ recorderManager.stop() },1000) },playvoice(){ console.log("點選playvoice") if (this.voicepath) { console.log("播放聲音") innerAudioContext.src = this.voicepath; innerAudioContext.play(); } },uploadvoicefile(){ // this.msg = "呼叫java端服務檔案路徑"+this.voicepath uni.uploadFile({ url: 'http://ip:埠/uploadFile(java端接收檔案介面名)',filePath: this.voicepath,//錄音結束後返回的臨時路徑, name: 'file',formData: { dev_id:1537 //中文帶標點 },success: (uploadFileRes) => { let word = uploadFileRes.data console.log("上傳音訊成功"+word); },fail: (res) => { console.log("上傳音訊失敗"+JSON.stringify(res)); } }); } } } </script> ``` //注意uploadFile 的url屬性 這個地方ip不能是localhost或127,如果自已電腦啟動java服務必須 是本機的真實ip如192.xxx這種,或者域名什麼的,並且java端介面一定要支援跨域,很多人卡到這個ip上,我也是網上很難找到解決問題的貼子 注意filePath這個路徑就是recorderManager的onStop事件就得到的_doc這種開頭的路徑,不需要加什麼file:不是像網上某些人說的加這種東西
Java端
pom裡面需要引用兩個包
<dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.16.3</version> </dependency> <dependency> <groupId>com.googlecode.soundlibs</groupId> <artifactId>mp3spi</artifactId> <version>1.9.5.4</version> </dependency> ``` import com.baidu.aip.speech.AipSpeech; import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader; import org.apache.commons.io.IOUtils; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import java.io.IOException; import java.io.InputStreamoRotBnKpk; import java.util.HashMap; @RestController @CrossOrigin(origins = "*") public class BaiduSpeech { //設定APPID/AK/SK public static final String APP_ID = ""; //去百度語音服務申請 public static final String API_KEY = "";//去百度語音服務申請 public static final String SECRET_KEY = "";//去百度語音服務申請 @RequestMapping(value = "/uploadFile") public String uploadFile( @RequestParam("dev_id") int dev_id,@RequestParam("file") MultipartFile file) throws Exception { byte[] pcmbytedata = mp3Convert2pcm(file.getInputStream()); HashMap<String,Object> options = new HashMap<String,Object>(); options.put("dev_pid",dev_id);// JSONObject jsonfrombaidu = basicBydata(pcmbytedata,"pcm",options); JSONArray jsonArray = jsonfrombaidu.getJSONArray("result"); String result = jsonArray.getString(0); System.out.println(result); //解析完的結果 return result; } // 獲取AipSpeech物件,建議單例使用 public static AipSpeech getClient() { AipSpeech client = new AipSpeech(APP_ID,API_KEY,SECRET_KEY); // 可選:設定網路連線引數 client.setConnectionTimeoutInMillis(2000); client.setSocketTimeoutInMillis(60000); return client; } // 語音識別(來自檔案) public static JSONObject basicBydata(byte[] voicedata,String fileType,HashMap<String,Object> options) { AipSpeech client = getClient(); return client.asr(voicedata,fileType,16000,options); } /** * MP3轉換PCM * @param inputStream MP3輸入流 * @throws Exception */ public static byte[] mp3Convert2pcm(InputStream inputStream) throws Exceptwww.cppcns.comion { //轉換PCM audioInputStream 資料 AudioInputStream audioInputStream = getPcmAudioInputStream(inputStream); byte[] pcmBytes = IOUtils.toByteArray(audioInputStream); return pcmBytes; } /** * 獲取PCM AudioInputStream 資料 * @param inputStream MP3輸入流 * @return AudioInputStream PCM輸入流 */ private static AudioInputStream getPcmAudioInputStream(InputStream inputStream) { AudioInputStream audioInputStream = null; AudioFormat targetFormat = null; try { AudioInputStream in = null; MpegAudioFileReader mp = new MpegAudioFileReader(); in = mp.getAudioInputStream(inputStream); AudioFormat baseFormat = in.getFormat(); targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,baseFormat.getSampleRate(),16,baseFormat.getChannels(),baseFormat.getChannels() * 2,false); audioInputStream = AudioSystem.getAudioInputStream(targetFormat,in); } catch (Exception e) { e.printStackTrace(); } return audioInputStream; } } ```
到此這篇關於uniapp呼叫百度語音實現錄音轉文字功能的文章就介紹到這了,更多相關uniapp錄音轉文字內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!