mstf-kit
Version:
一个现代化的 JavaScript/TypeScript 工具库,提供了丰富的常用工具函数
260 lines (259 loc) • 8.22 kB
TypeScript
/**
* 音频相关工具函数
*/
/**
* 预设采样率(Hz)
*/
export declare const SAMPLE_RATES: {
/** 语音识别推荐 */
readonly SPEECH: 16000;
/** 标准音质 */
readonly STANDARD: 22050;
/** CD音质 */
readonly CD: 44100;
/** 高清音质 */
readonly HD: 48000;
};
/**
* 预设通道数
*/
export declare const CHANNEL_COUNTS: {
/** 单声道,适合语音识别 */
readonly MONO: 1;
/** 立体声,适合音乐录制 */
readonly STEREO: 2;
};
/**
* 预设音频格式
*/
export declare const AUDIO_FORMATS: {
/** WAV格式,无损音质,文件较大 */
readonly WAV: "wav";
/** MP3格式,有损压缩,文件小,普遍支持 */
readonly MP3: "mp3";
/** WebM格式,专为网络优化,支持流式传输 */
readonly WEBM: "webm";
/** Ogg格式,开放格式,支持流式传输 */
readonly OGG: "ogg";
};
/**
* 采样率类型
*/
export type SampleRate = typeof SAMPLE_RATES[keyof typeof SAMPLE_RATES];
/**
* 通道数类型
*/
export type ChannelCount = typeof CHANNEL_COUNTS[keyof typeof CHANNEL_COUNTS];
/**
* 音频格式类型
*/
export type AudioFormat = typeof AUDIO_FORMATS[keyof typeof AUDIO_FORMATS];
/**
* 录音选项接口
*/
export interface RecorderOptions {
/**
* 音频格式
* - WAV: WAV格式,无损音质,文件较大
* - MP3: MP3格式,有损压缩,文件小,普遍支持
* - WEBM: WebM格式,专为网络优化,支持流式传输
* - OGG: Ogg格式,开放格式,支持流式传输
*/
format?: AudioFormat;
/**
* 采样率 (Hz)
* - SPEECH: 16000Hz(语音识别推荐)
* - STANDARD: 22050Hz(标准音质)
* - CD: 44100Hz(CD音质)
* - HD: 48000Hz(高清音质)
*/
sampleRate?: SampleRate;
/**
* 音频通道数
* - MONO: 1(单声道,适合语音识别)
* - STEREO: 2(立体声,适合音乐录制)
*/
channelCount?: ChannelCount;
/** 输出音频比特率 (kbps) */
bitRate?: number;
/** 是否启用回声消除 */
echoCancellation?: boolean;
/** 是否启用噪音抑制 */
noiseSuppression?: boolean;
/** 是否自动增益 */
autoGainControl?: boolean;
/** 是否使用流式录音模式 */
isStreaming?: boolean;
/** 数据块大小(毫秒),控制流式数据回调频率 */
timeslice?: number;
/** 流式数据回调,每当有新的音频数据块可用时调用 */
onDataAvailable?: (blob: Blob) => void;
/** 音频处理回调,接收原始音频分析数据,可用于音频可视化 */
onAudioProcess?: (audioData: Uint8Array) => void;
}
/**
* 录音状态
*/
export type RecorderState = 'inactive' | 'recording' | 'paused';
/**
* 录音器对象接口
*/
export interface Recorder {
/** 开始录音 */
start(): Promise<void>;
/** 暂停录音 */
pause(): void;
/** 恢复录音 */
resume(): void;
/** 停止录音并获取录音数据 */
stop(): Promise<Blob>;
/** 取消录音 */
cancel(): void;
/** 获取录音状态 */
getState(): RecorderState;
/** 获取录音时长(秒) */
getDuration(): number;
/** 获取实时音频分析数据 */
getAudioData(): Uint8Array;
/** 获取当前已采集的音频数据(不停止录音) */
getCurrentAudio(): Promise<Blob>;
/** 释放资源 */
release(): void;
}
/**
* 创建录音器
* @param options 录音选项
* @returns 录音器对象
* @example
* ```typescript
* // 创建录音器
* const recorder = await createRecorder({
* format: 'wav',
* sampleRate: 44100,
* channelCount: 1,
* // 流式获取数据
* timeslice: 500, // 每500毫秒获取一次数据
* onDataAvailable: (blob) => {
* // 处理音频数据块
* console.log('新的音频数据块大小:', blob.size);
* },
* onAudioProcess: (audioData) => {
* // 处理音频分析数据,用于可视化等
* console.log('音频数据:', audioData);
* }
* });
*
* // 开始录音
* await recorder.start();
*
* // 停止录音并获取数据
* const audioBlob = await recorder.stop();
*
* // 创建音频URL
* const audioUrl = URL.createObjectURL(audioBlob);
*
* // 释放资源
* recorder.release();
* ```
*/
export declare function createRecorder(options?: RecorderOptions): Promise<Recorder>;
/**
* 将音频Blob转换为AudioBuffer
* @param blob 音频Blob对象
* @param context 音频上下文
* @returns AudioBuffer对象
*/
export declare function blobToAudioBuffer(blob: Blob, context?: AudioContext): Promise<AudioBuffer>;
/**
* 播放音频Blob
* @param blob 音频Blob对象
* @returns 音频元素
*/
export declare function playAudioBlob(blob: Blob): HTMLAudioElement;
/**
* 将Base64音频数据转换为Blob
* @param base64 Base64音频数据
* @param mimeType MIME类型
* @returns 音频Blob对象
*/
export declare function base64ToAudioBlob(base64: string, mimeType: string): Blob;
/**
* 将音频Blob转换为Base64
* @param blob 音频Blob对象
* @returns Promise<string> Base64音频数据
*/
export declare function audioBlobToBase64(blob: Blob): Promise<string>;
/**
* 将流式音频响应转换为可读的音频 Blob
* @param stream 音频流数据(Response 对象或 ReadableStream)
* @param mimeType 音频 MIME 类型,例如 'audio/mp3' 或 'audio/wav',如果不提供将尝试自动检测
* @returns 包含音频数据的 Blob 对象的 Promise
*/
export declare function streamToAudioBlob(stream: Response | ReadableStream<Uint8Array>, mimeType?: string): Promise<Blob>;
/**
* 从流式音频响应创建并播放音频
* @param stream 音频流数据(Response 对象或 ReadableStream)
* @param mimeType 音频 MIME 类型
* @returns 音频元素
*/
export declare function playAudioStream(stream: Response | ReadableStream<Uint8Array>, mimeType?: string): Promise<HTMLAudioElement>;
/**
* 流式音频播放器接口
*/
export interface StreamingAudioPlayer {
/** 开始播放 */
play(): void;
/** 暂停播放 */
pause(): void;
/** 恢复播放 */
resume(): void;
/** 停止播放并释放资源 */
stop(): void;
/** 设置音量 (0-1) */
setVolume(volume: number): void;
/** 获取当前播放状态 */
getState(): 'playing' | 'paused' | 'stopped';
/** 获取总持续时间(秒) */
getDuration(): number;
/** 获取当前播放位置(秒) */
getCurrentTime(): number;
/** 跳转到指定位置(秒) */
seek(time: number): void;
/** 获取当前缓冲进度(0-1) */
getBufferedProgress(): number;
/** 设置播放结束回调 */
onEnded: (() => void) | null;
/** 设置缓冲进度更新回调 */
onBufferUpdate: ((progress: number) => void) | null;
/** 设置播放时间更新回调 */
onTimeUpdate: ((currentTime: number, duration: number) => void) | null;
/** 设置播放错误回调 */
onError: ((error: Error) => void) | null;
}
/**
* 流式音频播放器选项
*/
export interface StreamingAudioPlayerOptions {
/** 是否自动播放 */
autoPlay?: boolean;
/** 初始音量 (0-1) */
volume?: number;
/** 是否循环播放 */
loop?: boolean;
/** 缓冲区大小(秒) */
bufferSize?: number;
/** 是否使用 MediaSource 播放 (默认为 true,如果浏览器不支持则使用 Audio) */
useMediaSource?: boolean;
/** 是否在有足够数据时立即播放 (autoPlay 为 true 时有效) */
playWhenEnoughData?: boolean;
/** 每次缓冲更新触发的间隔(毫秒) */
bufferUpdateInterval?: number;
}
/**
* 创建流式音频播放器,支持边下载边播放
* @param stream 音频流数据(Response 对象或 ReadableStream)
* @param mimeType 音频 MIME 类型,例如 'audio/mp3' 或 'audio/wav'
* @param options 播放器选项
* @returns 流式音频播放器对象的 Promise
*/
export declare function createStreamingAudioPlayer(stream: Response | ReadableStream<Uint8Array>, mimeType?: string, options?: StreamingAudioPlayerOptions): Promise<StreamingAudioPlayer>;