| | |
| | |
|
| | | var isfilemode=false; // if it is in file mode
|
| | | var file_ext="";
|
| | | var file_sample_rate=16000; //for wav file sample rate
|
| | | var file_data_array; // array to save file data
|
| | |
|
| | | var totalsend=0;
|
| | |
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | upfile.onclick=function()
|
| | | {
|
| | | btnStart.disabled = true;
|
| | |
| | | btnConnect.disabled=false;
|
| | |
|
| | | }
|
| | |
|
| | | // from https://github.com/xiangyuecn/Recorder/tree/master
|
| | | var readWavInfo=function(bytes){
|
| | | //读取wav文件头,统一成44字节的头
|
| | | if(bytes.byteLength<44){
|
| | | return null;
|
| | | };
|
| | | var wavView=bytes;
|
| | | var eq=function(p,s){
|
| | | for(var i=0;i<s.length;i++){
|
| | | if(wavView[p+i]!=s.charCodeAt(i)){
|
| | | return false;
|
| | | };
|
| | | };
|
| | | return true;
|
| | | };
|
| | | |
| | | if(eq(0,"RIFF")&&eq(8,"WAVEfmt ")){
|
| | | |
| | | var numCh=wavView[22];
|
| | | if(wavView[20]==1 && (numCh==1||numCh==2)){//raw pcm 单或双声道
|
| | | var sampleRate=wavView[24]+(wavView[25]<<8)+(wavView[26]<<16)+(wavView[27]<<24);
|
| | | var bitRate=wavView[34]+(wavView[35]<<8);
|
| | | var heads=[wavView.subarray(0,12)],headSize=12;//head只保留必要的块
|
| | | //搜索data块的位置
|
| | | var dataPos=0; // 44 或有更多块
|
| | | for(var i=12,iL=wavView.length-8;i<iL;){
|
| | | if(wavView[i]==100&&wavView[i+1]==97&&wavView[i+2]==116&&wavView[i+3]==97){//eq(i,"data")
|
| | | heads.push(wavView.subarray(i,i+8));
|
| | | headSize+=8;
|
| | | dataPos=i+8;break;
|
| | | }
|
| | | var i0=i;
|
| | | i+=4;
|
| | | i+=4+wavView[i]+(wavView[i+1]<<8)+(wavView[i+2]<<16)+(wavView[i+3]<<24);
|
| | | if(i0==12){//fmt |
| | | heads.push(wavView.subarray(i0,i));
|
| | | headSize+=i-i0;
|
| | | }
|
| | | }
|
| | | if(dataPos){
|
| | | var wavHead=new Uint8Array(headSize);
|
| | | for(var i=0,n=0;i<heads.length;i++){
|
| | | wavHead.set(heads[i],n);n+=heads[i].length;
|
| | | }
|
| | | return {
|
| | | sampleRate:sampleRate
|
| | | ,bitRate:bitRate
|
| | | ,numChannels:numCh
|
| | | ,wavHead44:wavHead
|
| | | ,dataPos:dataPos
|
| | | };
|
| | | };
|
| | | };
|
| | | };
|
| | | return null;
|
| | | };
|
| | |
|
| | | upfile.onchange = function () {
|
| | | var len = this.files.length;
|
| | | for(let i = 0; i < len; i++) {
|
| | |
|
| | | let fileAudio = new FileReader();
|
| | | fileAudio.readAsArrayBuffer(this.files[i]);
|
| | | |
| | | file_ext=this.files[i].name.split('.').pop().toLowerCase();
|
| | |
|
| | | var audioblob;
|
| | | fileAudio.onload = function() {
|
| | | var audioblob= fileAudio.result;
|
| | | audioblob = fileAudio.result;
|
| | | |
| | | |
| | | file_data_array=audioblob;
|
| | | console.log(audioblob);
|
| | | |
| | |
|
| | | info_div.innerHTML='请点击连接进行识别';
|
| | | |
| | | |
| | | }
|
| | |
|
| | | fileAudio.onerror = function(e) {
|
| | | console.log('error' + e);
|
| | | }
|
| | | }
|
| | | // for wav file, we get the sample rate
|
| | | if(file_ext=="wav")
|
| | | for(let i = 0; i < len; i++) {
|
| | |
|
| | | let fileAudio = new FileReader();
|
| | | fileAudio.readAsArrayBuffer(this.files[i]); |
| | | fileAudio.onload = function() {
|
| | | audioblob = new Uint8Array(fileAudio.result);
|
| | | |
| | | // for wav file, we can get the sample rate
|
| | | var info=readWavInfo(audioblob);
|
| | | console.log(info);
|
| | | file_sample_rate=info.sampleRate;
|
| | | |
| | | |
| | | }
|
| | |
|
| | | |
| | | }
|
| | | |
| | | }
|
| | |
|
| | | function play_file()
|