worklet 录音,支持获取 pcm、音量、wav、音频频谱数据
npm install audio-recorder-worklet-processorworklet 录音,支持获取 pcm、音量、wav、音频频谱数据
为了应对不同业务场景,很多情况不需要对音频数据做缓存,如实时转写等,所以这里不对音频数据做存储,仅提供原子能力
如果业务有需求可以自己存储音频数据,再调用这里提供的方法转成 PCM 等格式(也可以自己写转换方法,这里仅提供 PCM 和 WAV 两种)
内置了多种噪音消除算法,可以根据业务需求选择,对各算法浏览器支持情况需要自行测试
浏览器支持
charome 66+
Firefox 76+
Edge 79+
Opera 53+
Safari 14.1+
#### DOC
调用
``js
import Recorder from "audio-recorder-worklet-processor";
const recorder = new Recorder();
`
或
`javascript
;
const recorder = new Recorder();
`
初始化
`typescript
interface IProcessOptions {
processSize?: number; //收集采样的大小,采集完多少后触发onDataProcess一次,默认4096
numChannels?: 1 | 2; //声道数 1或2,默认单声道
sampleBits?: 16 | 8; //采样位数 一般8,16,默认16
sampleRate?: number; //采样率 一般 11025、16000、22050、24000、44100、48000,默认为16000
}
interface IAnalyserOptions {
open: boolean; //是否开启analyserNode,默认否
fftSize: number; //具体含义可以看mdn的定义,简单来说数值越大精度越高,取值范围32-32768,默认512
}
interface INoiseReductionOptions {
open: boolean; //是否启用降噪,默认否
frequency?: number; //滤波器中心频率,默认1300Hz(人声主要在300-3400之间)
Q?: number; //滤波器品质因数,默认1(主要决定过滤带宽,如中心频率1300品质因数1.5,1300/1.5 = 650,则有效通过范围为1300-650到1300+650之间)
}
interface IRnnoiseOptions {
useRnnoise: boolean; // 是否启用rnnoise,默认否
rnnoiseWasmPath: string; // rnnoise wasm 文件路径,audio-recorder-worklet-processor-copy/dist/rnnoise.wasm(需要根据不同框架自己兼容引入wasm)
rnnoiseSimdWasmPath: string; // rnnoise simd wasm 文件路径,audio-recorder-worklet-processor-copy/dist/rnnoise_simd.wasm(需要根据不同框架自己兼容引入wasm)
rnnoiseWorkletPath: string; // rnnoise worklet 文件路径,audio-recorder-worklet-processor-copy/dist/rnnoise.worklet.js(需要根据不同框架自己兼容引入worklet)
}
interface IConfig {
//录音的实时回调,可以获取音频原始数据和音量区间0-1(觉得不敏感可以自己乘以倍率)
onDataProcess?: (data: { vol: number; buffer: Float32Array }) => void;
//process配置
processOptions: IProcessOptions;
//analyserNode配置,用来提供实时频率分析和时域分析的切点数据(可以用作数据分析和可视化),默认不开启
analyserOptions?: IAnalyserOptions;
//降噪配置(滤波器),默认不开启
noiseReductionOptions?: INoiseReductionOptions;
//是否使用Vonage的开源ai降噪算法,默认否(建议不和滤波器一起使用)
useVonage?: boolean;
//是否使用Rnnoise的开源ai降噪算法,默认否(建议不和滤波器一起使用, 和useVonage不能同时使用)
rnnoiseOptions?: IRnnoiseOptions
}
// init(config?: IConfig): Promise
recorder.init(config);
`
开始录音
`typescript`
//start(): Promise
recorder.start();
停止收音
`typescript`
//返回录音时长,在调用stop时,会将缓存区不足processSize大小的数据再调用一次onDataProcess返回,所以不用担心丢失录音数据
//stop(): Promise
recorder.stop();
销毁
`typescript`
recorder.destroy();
获取音频频谱数据
`typescript`
//getAnalyserData(): Uint8Array
recorder.getAnalyserData();
process 原始数据转 PCM
如果使用这里的录音获取的数据 sampleBits 和 littleEdian 可以不传,如果用这个方法处理其他录音的数据则需要指定一下,否则可能返回数据有问题
`typescript`
//**
*
* @param {Float32Array} bytes process原数据
* @param {number} sampleBits 采样位数,默认为init时的参数,未传入则为init默认值
* @param {boolean} littleEdian 是否是小端字节序,未传入时根据系统自动判断
* @returns {DataView} PCM数据
*/
recorder.encodePCM(bytes, sampleBits, littleEdian)
PCM 转 WAV
`typescript`
//**
*
* @param {DataView} buffer PCM数据
* @param {Float32Array} sampleRate 采样率,默认为init时的参数,未传入则为init默认值
* @param {Float32Array} numChannels 声道数,默认为init时的参数,未传入则为init默认值
* @param {Float32Array} sampleBits 采样位数,默认为init时的参数,未传入则为init默认值
* @param {boolean} littleEdian 是否是小端字节序,未传入时根据系统自动判断
* @returns {DataView} WAV数据
*/
recorder.encodeWAV(buffer, sampleRate, numChannels, sampleBits, littleEdian)
DataView 转 base64
`typescript`
//**
*
* @param {DataView} DataView数据
* @returns {DataView} base64数据
*/
recorder.dataViewToBase64(dataView)
#### Example
`html``