mstf-kit
Version:
一个现代化的 JavaScript/TypeScript 工具库,提供了丰富的常用工具函数
250 lines (249 loc) • 7.32 kB
TypeScript
/**
* 音频请求工具函数
* 支持处理音频流,包括常规请求和流式请求的响应处理
*/
/**
* 音频数据类型
*/
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;