UNPKG

mstf-kit

Version:

一个现代化的 JavaScript/TypeScript 工具库,提供了丰富的常用工具函数

260 lines (259 loc) 8.22 kB
/** * 音频相关工具函数 */ /** * 预设采样率(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>;