UNPKG

mstf-kit

Version:

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

250 lines (249 loc) 7.32 kB
/** * 音频请求工具函数 * 支持处理音频流,包括常规请求和流式请求的响应处理 */ /** * 音频数据类型 */ export interface AudioData { /** 音频base64数据 */ audio?: string; /** 是否为最后一块数据 */ is_last?: boolean; /** 数据类型 */ type?: string; /** 其他任意属性 */ [key: string]: any; } /** * 音频处理选项 */ export interface AudioProcessOptions { /** 是否自动播放音频 */ autoPlay?: boolean; /** 是否返回完整的Blob (仅用于流式请求) */ returnBlob?: boolean; /** MIME类型 */ mimeType?: string; /** 收到音频数据回调 */ onAudioData?: (audioBlob: Blob) => void; /** 错误回调 */ onError?: (error: Error) => void; /** 完成回调 */ onComplete?: (blob?: Blob) => void; /** 音频开始播放回调 */ onStart?: () => void; /** 音频播放结束回调 */ onEnded?: () => void; /** 音频数据字段路径,例如'data.audio'或'audio' */ audioField?: string; } /** * 音频控制接口 */ export interface AudioControl { /** 暂停播放 */ pause: () => void; /** 恢复播放 */ resume: () => void; /** 中止处理 */ abort: () => void; /** 是否正在播放 */ isPlaying: () => boolean; /** 完整音频Blob (如果returnBlob为true) */ finalBlob?: Promise<Blob>; } /** * 处理流式音频响应 * @param reader 响应流的Reader对象 * @param options 处理选项 * @returns 控制对象 */ export declare function processStreamResponse(reader: ReadableStreamDefaultReader<Uint8Array>, options?: AudioProcessOptions): Promise<AudioControl>; /** * 处理Axios进度事件的音频数据 * @param onDownloadProgress Axios进度事件处理函数 * @param options 处理选项 * @returns 控制对象 */ export declare function processAxiosProgress(options?: AudioProcessOptions): { onDownloadProgress: (progressEvent: any) => void; pause: () => void; resume: () => void; abort: () => void; isPlaying: () => boolean; finalBlob?: Promise<Blob>; }; /** * 处理音频数据 * @param arrayBuffer ArrayBuffer音频数据 * @param options 处理选项 * @returns Blob对象 */ export declare function processArrayBuffer(arrayBuffer: ArrayBuffer, options?: AudioProcessOptions): Blob; /** * 处理Blob音频数据 * @param blob Blob音频数据 * @param options 处理选项 * @returns Blob对象 */ export declare function processBlob(blob: Blob, options?: AudioProcessOptions): Blob; /** * 创建Axios请求的处理配置 * @param options 处理选项 * @returns axios配置和控制对象 */ export declare function createAxiosAudioOptions(options?: AudioProcessOptions): { axiosConfig: { responseType: string; onDownloadProgress: (progressEvent: any) => void; }; pause: () => void; resume: () => void; abort: () => void; isPlaying: () => boolean; finalBlob?: Promise<Blob>; }; /** * 处理用户直接提供的base64音频数据 * @param base64Audio base64编码的音频数据 * @param options 处理选项 * @returns 控制对象 */ export declare function processBase64Audio(base64Audio: string, options?: AudioProcessOptions): { blob: Blob; pause: () => void; resume: () => void; abort: () => void; isPlaying: () => boolean; }; /** * 创建base64音频流处理器,用于处理用户持续传入的base64音频数据 * @param options 处理选项 * @returns 处理器对象 */ export declare function createBase64StreamProcessor(options?: AudioProcessOptions): { processChunk: (base64Chunk: string, isLast?: boolean) => Promise<void>; getBlob: () => Blob | null; getAudioUrl: () => string | null; pause: () => void; resume: () => void; abort: () => void; isPlaying: () => boolean; finalBlob?: Promise<Blob>; }; /** * 音频请求工具 * @example * ```typescript * // 处理流式响应 * const response = await fetch('https://api.example.com/audio/stream', { * method: 'POST', * headers: { 'Content-Type': 'application/json' }, * body: JSON.stringify({ text: '要合成的文本' }) * }); * * const reader = response.body.getReader(); * const { pause, resume, abort, isPlaying, finalBlob } = await processStreamResponse(reader, { * autoPlay: true, * returnBlob: true, * onAudioData: (blob) => { * // 处理每个音频数据块 * console.log('收到音频数据块:', blob.size); * } * }); * * // 暂停播放 * pauseButton.onclick = () => { * pause(); * }; * * // 恢复播放 * playButton.onclick = () => { * resume(); * }; * * // 检查播放状态 * console.log('是否正在播放:', isPlaying()); * * // 使用Axios进行流式音频请求 * import axios from 'axios'; * * // 创建Axios配置 * const { axiosConfig, pause, resume, abort, isPlaying, finalBlob } = createAxiosAudioOptions({ * autoPlay: true, * returnBlob: true, * audioField: 'data.audio', // 音频数据在响应中的路径 * onAudioData: (blob) => { * console.log('收到音频数据块:', blob.size); * } * }); * * // 发送请求 * const response = await axios.post( * 'https://api.example.com/audio/stream', * { text: '要合成的文本' }, * axiosConfig * ); * * // 如果需要获取完整的Blob * if (finalBlob) { * const completeBlob = await finalBlob; * const url = URL.createObjectURL(completeBlob); * console.log('完整音频URL:', url); * } * * // 处理用户直接提供的base64音频数据 * const base64Audio = 'RIFF...'; // 用户已经处理好的base64音频数据 * const { blob, pause, resume, isPlaying } = processBase64Audio(base64Audio, { * autoPlay: true, * onComplete: (blob) => { * const url = URL.createObjectURL(blob); * console.log('音频URL:', url); * } * }); * * // 处理用户持续传入的base64音频数据流 * const processor = createBase64StreamProcessor({ * autoPlay: false, * returnBlob: true, * onAudioData: (blob) => { * console.log('收到音频数据块:', blob.size); * }, * onComplete: (blob) => { * console.log('处理完成, 音频大小:', blob.size); * } * }); * * // 用户持续传入数据 * userStream.on('data', (base64Chunk) => { * processor.processChunk(base64Chunk); * }); * * // 控制播放 * pauseButton.onclick = () => processor.pause(); * playButton.onclick = () => processor.resume(); * * // 数据传输完成 * userStream.on('end', () => { * processor.processChunk('最后一块数据', true); // isLast=true 表示这是最后一块数据 * const audioUrl = processor.getAudioUrl(); * console.log('最终音频URL:', audioUrl); * }); * * // 中止处理 * cancelButton.onclick = () => { * processor.abort(); * }; * ``` */ declare const _default: { processStreamResponse: typeof processStreamResponse; processArrayBuffer: typeof processArrayBuffer; processBlob: typeof processBlob; processAxiosProgress: typeof processAxiosProgress; createAxiosAudioOptions: typeof createAxiosAudioOptions; processBase64Audio: typeof processBase64Audio; createBase64StreamProcessor: typeof createBase64StreamProcessor; }; export default _default;