@bddh/starling-realtime-client
Version:
2 lines (1 loc) • 5 kB
JavaScript
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var _rollupPluginBabelHelpers=require("./_virtual/_rollupPluginBabelHelpers.js");function sampleData(pcmDatas,pcmSampleRate,newSampleRate,prevChunkInfo){try{for(var index=(prevChunkInfo=prevChunkInfo||{})&&"number"==typeof prevChunkInfo.index?prevChunkInfo.index:0,offset=prevChunkInfo&&"number"==typeof prevChunkInfo.offset?prevChunkInfo.offset:0,size=0,i=index;i<pcmDatas.length;i++)size+=pcmDatas[i].length;size=Math.max(0,size-Math.floor(offset));var step=pcmSampleRate/newSampleRate;step>1?size=Math.floor(size/step):(step=1,newSampleRate=pcmSampleRate);for(var res=new Int16Array(size),idx=0,nl=pcmDatas.length;index<nl;index++){for(var o=pcmDatas[index],_i=offset,il=o.length;_i<il;){var before=Math.floor(_i),after=Math.ceil(_i),atPoint=_i-before;res[idx]=o[before]+(o[after]-o[before])*atPoint,idx++,_i+=step}offset=_i-il}return{index:index,offset:offset,sampleRate:newSampleRate,data:res}}catch(error){console.log("转音错误了",error)}}function convertBuffer(arrayBuffer){for(var data=arrayBuffer,out=new Int16Array(arrayBuffer.length),i=0;i<data.length;i++){var s=Math.max(-1,Math.min(1,data[i]));out[i]=s<0?32768*s:32767*s}return out}var RecordController=function(_preWarmStream,_start){function RecordController(options){_rollupPluginBabelHelpers.classCallCheck(this,RecordController),_rollupPluginBabelHelpers.defineProperty(this,"onAudioData",void 0),_rollupPluginBabelHelpers.defineProperty(this,"onError",void 0),_rollupPluginBabelHelpers.defineProperty(this,"audioContext",null),_rollupPluginBabelHelpers.defineProperty(this,"processor",null),_rollupPluginBabelHelpers.defineProperty(this,"mediaStream",null),_rollupPluginBabelHelpers.defineProperty(this,"recording",!1),_rollupPluginBabelHelpers.defineProperty(this,"audio3AConstraints",void 0),_rollupPluginBabelHelpers.defineProperty(this,"asrSample",void 0),this.onAudioData=options.onAudioData,this.onError=options.onError,this.audio3AConstraints=options.audio3AConstraints,this.asrSample=options.asrSample,this.preWarmStream()}return _rollupPluginBabelHelpers.createClass(RecordController,[{key:"preWarmStream",value:function(){return(_preWarmStream=_preWarmStream||_rollupPluginBabelHelpers.asyncToGenerator(_rollupPluginBabelHelpers.regeneratorRuntime().mark((function _callee(){var _navigator$mediaDevic,AudioCtx,source;return _rollupPluginBabelHelpers.regeneratorRuntime().wrap((function(_context){for(;;)switch(_context.prev=_context.next){case 0:if(_context.prev=0,AudioCtx=window.AudioContext||window.webkitAudioContext){_context.next=4;break}throw new Error("当前环境不支持web api: AudioContext");case 4:if(null!==(_navigator$mediaDevic=navigator.mediaDevices)&&void 0!==_navigator$mediaDevic&&_navigator$mediaDevic.getUserMedia){_context.next=6;break}throw new Error("当前环境不支持web api: getUserMedia");case 6:return this.audioContext=new AudioCtx({sampleRate:this.asrSample||16e3}),_context.next=9,navigator.mediaDevices.getUserMedia({audio:_rollupPluginBabelHelpers.objectSpread2({echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},this.audio3AConstraints),video:!1});case 9:this.mediaStream=_context.sent,source=this.audioContext.createMediaStreamSource(this.mediaStream),this.processor=this.audioContext.createScriptProcessor(1024,1,1),source.connect(this.processor),this.processor.connect(this.audioContext.destination),this.processor.onaudioprocess=function(){},_context.next=20;break;case 17:_context.prev=17,_context.t0=_context.catch(0),console.error("preWarmStream error",_context.t0);case 20:case"end":return _context.stop()}}),_callee,this,[[0,17]])})))).apply(this,arguments)}},{key:"start",value:function(){return(_start=_start||_rollupPluginBabelHelpers.asyncToGenerator(_rollupPluginBabelHelpers.regeneratorRuntime().mark((function _callee2(){var _this=this;return _rollupPluginBabelHelpers.regeneratorRuntime().wrap((function(_context2){for(;;)switch(_context2.prev=_context2.next){case 0:if(!this.recording){_context2.next=2;break}return _context2.abrupt("return");case 2:if(this.audioContext&&this.processor){_context2.next=4;break}return _context2.abrupt("return");case 4:try{this.processor.onaudioprocess=function(e){if(_this.recording){var resampled=sampleData([convertBuffer(e.inputBuffer.getChannelData(0))],_this.audioContext.sampleRate,_this.asrSample||16e3,null);resampled&&resampled.data&&_this.onAudioData(resampled.data.buffer)}},this.recording=!0}catch(err){this.onError&&this.onError(err)}case 5:case"end":return _context2.stop()}}),_callee2,this)})))).apply(this,arguments)}},{key:"stop",value:function(){this.recording=!1,this.processor.onaudioprocess=function(){}}},{key:"destroy",value:function(){this.recording=!1,this.processor&&(this.processor.disconnect(),this.processor.onaudioprocess=null),this.audioContext&&this.audioContext.close(),this.mediaStream&&this.mediaStream.getTracks().forEach((function(track){track.stop()}))}}]),RecordController}();exports.default=RecordController;