1 |
- {"ast":null,"code":"\"use strict\";\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.PcmRecorder = void 0;\nconst Exports_1 = require(\"../common/Exports\");\nclass PcmRecorder {\n constructor(stopInputOnRelease) {\n this.privStopInputOnRelease = stopInputOnRelease;\n }\n record(context, mediaStream, outputStream) {\n const desiredSampleRate = 16000;\n const waveStreamEncoder = new Exports_1.RiffPcmEncoder(context.sampleRate, desiredSampleRate);\n const micInput = context.createMediaStreamSource(mediaStream);\n const attachScriptProcessor = () => {\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n const scriptNode = (() => {\n let bufferSize = 0;\n try {\n return context.createScriptProcessor(bufferSize, 1, 1);\n } catch (error) {\n // Webkit (<= version 31) requires a valid bufferSize.\n bufferSize = 2048;\n let audioSampleRate = context.sampleRate;\n while (bufferSize < 16384 && audioSampleRate >= 2 * desiredSampleRate) {\n bufferSize <<= 1;\n audioSampleRate >>= 1;\n }\n return context.createScriptProcessor(bufferSize, 1, 1);\n }\n })();\n scriptNode.onaudioprocess = event => {\n const inputFrame = event.inputBuffer.getChannelData(0);\n if (outputStream && !outputStream.isClosed) {\n const waveFrame = waveStreamEncoder.encode(inputFrame);\n if (!!waveFrame) {\n outputStream.writeStreamChunk({\n buffer: waveFrame,\n isEnd: false,\n timeReceived: Date.now()\n });\n }\n }\n };\n micInput.connect(scriptNode);\n scriptNode.connect(context.destination);\n this.privMediaResources = {\n scriptProcessorNode: scriptNode,\n source: micInput,\n stream: mediaStream\n };\n };\n // https://webaudio.github.io/web-audio-api/#audioworklet\n // Using AudioWorklet to improve audio quality and avoid audio glitches due to blocking the UI thread\n const skipAudioWorklet = !!this.privSpeechProcessorScript && this.privSpeechProcessorScript.toLowerCase() === \"ignore\";\n if (!!context.audioWorklet && !skipAudioWorklet) {\n if (!this.privSpeechProcessorScript) {\n const workletScript = `class SP extends AudioWorkletProcessor {\n constructor(options) {\n super(options);\n }\n process(inputs, outputs) {\n const input = inputs[0];\n const output = [];\n for (let channel = 0; channel < input.length; channel += 1) {\n output[channel] = input[channel];\n }\n this.port.postMessage(output[0]);\n return true;\n }\n }\n registerProcessor('speech-processor', SP);`;\n const blob = new Blob([workletScript], {\n type: \"application/javascript; charset=utf-8\"\n });\n this.privSpeechProcessorScript = URL.createObjectURL(blob);\n }\n context.audioWorklet.addModule(this.privSpeechProcessorScript).then(() => {\n const workletNode = new AudioWorkletNode(context, \"speech-processor\");\n workletNode.port.onmessage = ev => {\n const inputFrame = ev.data;\n if (outputStream && !outputStream.isClosed) {\n const waveFrame = waveStreamEncoder.encode(inputFrame);\n if (!!waveFrame) {\n outputStream.writeStreamChunk({\n buffer: waveFrame,\n isEnd: false,\n timeReceived: Date.now()\n });\n }\n }\n };\n micInput.connect(workletNode);\n workletNode.connect(context.destination);\n this.privMediaResources = {\n scriptProcessorNode: workletNode,\n source: micInput,\n stream: mediaStream\n };\n }).catch(() => {\n attachScriptProcessor();\n });\n } else {\n try {\n attachScriptProcessor();\n } catch (err) {\n throw new Error(`Unable to start audio worklet node for PCMRecorder: ${err}`);\n }\n }\n }\n releaseMediaResources(context) {\n if (this.privMediaResources) {\n if (this.privMediaResources.scriptProcessorNode) {\n this.privMediaResources.scriptProcessorNode.disconnect(context.destination);\n this.privMediaResources.scriptProcessorNode = null;\n }\n if (this.privMediaResources.source) {\n this.privMediaResources.source.disconnect();\n if (this.privStopInputOnRelease) {\n this.privMediaResources.stream.getTracks().forEach(track => track.stop());\n }\n this.privMediaResources.source = null;\n }\n }\n }\n setWorkletUrl(url) {\n this.privSpeechProcessorScript = url;\n }\n}\nexports.PcmRecorder = PcmRecorder;","map":{"version":3,"names":["Object","defineProperty","exports","value","PcmRecorder","Exports_1","require","constructor","stopInputOnRelease","privStopInputOnRelease","record","context","mediaStream","outputStream","desiredSampleRate","waveStreamEncoder","RiffPcmEncoder","sampleRate","micInput","createMediaStreamSource","attachScriptProcessor","scriptNode","bufferSize","createScriptProcessor","error","audioSampleRate","onaudioprocess","event","inputFrame","inputBuffer","getChannelData","isClosed","waveFrame","encode","writeStreamChunk","buffer","isEnd","timeReceived","Date","now","connect","destination","privMediaResources","scriptProcessorNode","source","stream","skipAudioWorklet","privSpeechProcessorScript","toLowerCase","audioWorklet","workletScript","blob","Blob","type","URL","createObjectURL","addModule","then","workletNode","AudioWorkletNode","port","onmessage","ev","data","catch","err","Error","releaseMediaResources","disconnect","getTracks","forEach","track","stop","setWorkletUrl","url"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.browser/PCMRecorder.js"],"sourcesContent":["\"use strict\";\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PcmRecorder = void 0;\nconst Exports_1 = require(\"../common/Exports\");\nclass PcmRecorder {\n constructor(stopInputOnRelease) {\n this.privStopInputOnRelease = stopInputOnRelease;\n }\n record(context, mediaStream, outputStream) {\n const desiredSampleRate = 16000;\n const waveStreamEncoder = new Exports_1.RiffPcmEncoder(context.sampleRate, desiredSampleRate);\n const micInput = context.createMediaStreamSource(mediaStream);\n const attachScriptProcessor = () => {\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n const scriptNode = (() => {\n let bufferSize = 0;\n try {\n return context.createScriptProcessor(bufferSize, 1, 1);\n }\n catch (error) {\n // Webkit (<= version 31) requires a valid bufferSize.\n bufferSize = 2048;\n let audioSampleRate = context.sampleRate;\n while (bufferSize < 16384 && audioSampleRate >= (2 * desiredSampleRate)) {\n bufferSize <<= 1;\n audioSampleRate >>= 1;\n }\n return context.createScriptProcessor(bufferSize, 1, 1);\n }\n })();\n scriptNode.onaudioprocess = (event) => {\n const inputFrame = event.inputBuffer.getChannelData(0);\n if (outputStream && !outputStream.isClosed) {\n const waveFrame = waveStreamEncoder.encode(inputFrame);\n if (!!waveFrame) {\n outputStream.writeStreamChunk({\n buffer: waveFrame,\n isEnd: false,\n timeReceived: Date.now(),\n });\n }\n }\n };\n micInput.connect(scriptNode);\n scriptNode.connect(context.destination);\n this.privMediaResources = {\n scriptProcessorNode: scriptNode,\n source: micInput,\n stream: mediaStream,\n };\n };\n // https://webaudio.github.io/web-audio-api/#audioworklet\n // Using AudioWorklet to improve audio quality and avoid audio glitches due to blocking the UI thread\n const skipAudioWorklet = !!this.privSpeechProcessorScript && this.privSpeechProcessorScript.toLowerCase() === \"ignore\";\n if (!!context.audioWorklet && !skipAudioWorklet) {\n if (!this.privSpeechProcessorScript) {\n const workletScript = `class SP extends AudioWorkletProcessor {\r\n constructor(options) {\r\n super(options);\r\n }\r\n process(inputs, outputs) {\r\n const input = inputs[0];\r\n const output = [];\r\n for (let channel = 0; channel < input.length; channel += 1) {\r\n output[channel] = input[channel];\r\n }\r\n this.port.postMessage(output[0]);\r\n return true;\r\n }\r\n }\r\n registerProcessor('speech-processor', SP);`;\n const blob = new Blob([workletScript], { type: \"application/javascript; charset=utf-8\" });\n this.privSpeechProcessorScript = URL.createObjectURL(blob);\n }\n context.audioWorklet\n .addModule(this.privSpeechProcessorScript)\n .then(() => {\n const workletNode = new AudioWorkletNode(context, \"speech-processor\");\n workletNode.port.onmessage = (ev) => {\n const inputFrame = ev.data;\n if (outputStream && !outputStream.isClosed) {\n const waveFrame = waveStreamEncoder.encode(inputFrame);\n if (!!waveFrame) {\n outputStream.writeStreamChunk({\n buffer: waveFrame,\n isEnd: false,\n timeReceived: Date.now(),\n });\n }\n }\n };\n micInput.connect(workletNode);\n workletNode.connect(context.destination);\n this.privMediaResources = {\n scriptProcessorNode: workletNode,\n source: micInput,\n stream: mediaStream,\n };\n })\n .catch(() => {\n attachScriptProcessor();\n });\n }\n else {\n try {\n attachScriptProcessor();\n }\n catch (err) {\n throw new Error(`Unable to start audio worklet node for PCMRecorder: ${err}`);\n }\n }\n }\n releaseMediaResources(context) {\n if (this.privMediaResources) {\n if (this.privMediaResources.scriptProcessorNode) {\n this.privMediaResources.scriptProcessorNode.disconnect(context.destination);\n this.privMediaResources.scriptProcessorNode = null;\n }\n if (this.privMediaResources.source) {\n this.privMediaResources.source.disconnect();\n if (this.privStopInputOnRelease) {\n this.privMediaResources.stream.getTracks().forEach((track) => track.stop());\n }\n this.privMediaResources.source = null;\n }\n }\n }\n setWorkletUrl(url) {\n this.privSpeechProcessorScript = url;\n }\n}\nexports.PcmRecorder = PcmRecorder;\n\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"script","externalDependencies":[]}
|