基于webrtc实现多人视频会议语音转写文字

2,320 阅读1分钟

第一步

实现单人语音转写文字,当进入房间只有一个人时,这个时候就相当于这个房间是一个录音机,自动监听外部环境的声音,将声音转写为文字记录下来

语音实时转写文字需要用到websocket与后台保持持久连接

判断是http还是https 决定是wss,还是ws

var ws_host
if(window.location.protocol === 'http:'){
   ws_host = 'ws://' + window.location.hostname + ':8080'
}else{
   ws_host='wss://' + window.location.hostname + '8089'
}

绑定开始按钮
var ws=null;
var recorder=null;
function startRecord(){
    ws=new webSocket(
        ws_host + '接口名参数'
    )
    ws.onopen = function () {
          log_println('ASR channel opened')
          navigator.mediaDevices
            .getUserMedia({ audio: true, video: false })
            .then((stream) => {
              recorder = RecordRTC(stream, {
                type: 'audio',
                mimeType: 'audio/wav',
                recorderType: StereoAudioRecorder,
                desiredSampRate: 16000,
                numberOfAudioChannels: 1,
                timeSlice: 1000,
                bufferSize: 16384,
                ondataavailable: sendData,
              })
              recorder.startRecording()
            })
        }
    // 数据返回
    ws.onmessage = function (event) {
          let res = JSON.parse(event.data)
          if (res.code == 200 && res.final == true) {
            console.log(res.text)
          }
        }
}
//发送数据

    function sendData(blob) {
        blob.arrayBuffer().then((buffer) => {
          let raw = buffer.slice(44)
          ws.send(raw)
        })
      }

第二步

双人或多人视频时语音转写文字

双人或多人时就区分成本地端和远端

    本端
    onlocalstream:function(stream){
        var ws = new WebSocket(
            ws_host+ '接口名和参数'
        )
        连接成功
        ws.onopen = function () {
			let recorder = new RecordRTCPromisesHandler(stream, {
				type: "audio",
				mimeType: "audio/wav",
				recorderType: StereoAudioRecorder,
				desiredSampRate: 16000,
				numberOfAudioChannels: 1,
				timeSlice: 1000,
				bufferSize: 16384,
				ondataavailable: sendDataaudio,
			});
			recorder.startRecording();
		};
		//音频数据发送
		let sendDataaudio = function (blob) {
				blob.arrayBuffer().then((buffer) => {
				let raw = buffer.slice(44);
					ws.send(raw);
				});
			};
		//实时接受音频文字
		ws.onmessage = function (event) {
			let res = JSON.parse(event.data);
			if (res.code == 200 && res.final == true) {
				console.log(res.text);
				}
		};
    }
    
    
    远端
    onremotestream:function(stream){
        var ws = new WebSocket(
            ws_host+ '接口名和参数'
        )
        ws.onopen = function () {
				let recorder = new RecordRTCPromisesHandler(stream, {
					type: "audio",
					mimeType: "audio/wav",
					recorderType: StereoAudioRecorder,
					desiredSampRate: 16000,
					numberOfAudioChannels: 1,
					timeSlice: 1000,
					bufferSize: 16384,
					ondataavailable: sendData,
				});
				recorder.startRecording();
			};
		//音频数据发送
		let sendDataaudio = function (blob) {
				blob.arrayBuffer().then((buffer) => {
				let raw = buffer.slice(44);
					ws.send(raw);
				});
			};
		//实时接受音频文字
		ws.onmessage = function (event) {
			let res = JSON.parse(event.data);
			if (res.code == 200 && res.final == true) {
				console.log(res.text);
				}
		};
    }
    
    ```