Recorder icon indicating copy to clipboard operation
Recorder copied to clipboard

为库添加ts类型

Open lvzhenbo opened this issue 5 months ago • 2 comments

由于详细的文档没有,我得在大篇幅的readme和示例里面找东西,如果有类型提示就好很多了,这是我用ai去生成的类型,可以参考一下

// Recorder Core 类型定义

/** 录音配置选项 */
export interface RecorderOptions {
  /** 输出类型,如 "mp3" | "wav" */
  type?: string;
  /** 比特率,wav: 16或8位,MP3: 8kbps等 */
  bitRate?: number;
  /** 采样率 */
  sampleRate?: number;
  /** 实时处理回调函数 */
  onProcess?: (
    buffers: Int16Array[],
    powerLevel: number,
    bufferDuration: number,
    bufferSampleRate: number,
    newBufferIdx: number,
    asyncEnd: () => void,
  ) => boolean | void;
  /** 可选直接提供一个媒体流 */
  sourceStream?: MediaStream;
  /** 可选提供一个 running 状态的 AudioContext */
  runningContext?: AudioContext;
  /** 音频轨道设置 */
  audioTrackSet?: MediaTrackConstraints;
  /** 视频轨道设置 */
  videoTrackSet?: MediaTrackConstraints;
  /** 禁用设备卡顿时音频输入丢失补偿功能 */
  disableEnvInFix?: boolean;
  /** 实时编码环境下接管编码器输出 */
  takeoffEncodeChunk?: (chunkBytes: Uint8Array) => void;
}

/** 录音器实例接口 */
export interface RecorderInstance {
  /** 录音器实例 ID */
  id: number;
  /** 录音配置 */
  set: RecorderOptions;
  /** 运行状态 0:未录音 1:录音中 2:暂停 3:等待ctx激活 */
  state: number;
  /** 原始采样率 */
  srcSampleRate?: number;
  /** 是否为模拟录音 */
  isMock?: number;
  /** 模拟环境信息 */
  mockEnvInfo?: Record<string, unknown>;
  /** 数据缓冲 */
  buffers?: Int16Array[];
  /** 数据大小 */
  recSize?: number;
  /** 数据类型 */
  dataType?: 'blob' | 'arraybuffer';

  /** 打开录音资源 */
  open(success?: () => void, fail?: (msg: string, isUserNotAllow?: boolean) => void): void;
  /** 关闭释放录音资源 */
  close(callback?: () => void): void;
  /** 开始录音 */
  start(): void;
  /** 暂停录音 */
  pause(): void;
  /** 恢复录音 */
  resume(): void;
  /** 停止录音并返回数据 */
  stop(
    success?: (blob: Blob | ArrayBuffer, duration: number, mime: string) => void,
    fail?: (msg: string) => void,
    autoClose?: boolean,
  ): void;
  /** 模拟录音数据 */
  mock(pcmData: Int16Array, pcmSampleRate: number): RecorderInstance;
  /** 环境检查 */
  envCheck(envInfo?: EnvInfo): string;
  /** 日志输出 */
  CLog(msg: string, type?: number, ...args: unknown[]): void;
}

/** 环境信息接口 */
export interface EnvInfo {
  /** 环境名称 */
  envName?: string;
  /** 是否可以实时处理 */
  canProcess?: boolean;
}

/** 采样数据转换选项 */
export interface SampleDataOption {
  /** 帧大小 */
  frameSize?: number;
  /** 帧类型 */
  frameType?: string;
  /** 内部使用的 sum 选项 */
  _sum?: boolean;
}

/** 采样数据块信息 */
export interface ChunkInfo {
  /** 已处理到的索引 */
  index: number;
  /** 已处理到的偏移位置 */
  offset: number;
  /** 提升采样率时的前一个采样值 */
  raisePrev: number | null;
  /** 滤波配置 */
  filter: FilterConfig | null;
  /** 下一帧的部分数据 */
  frameNext: Int16Array | null;
  /** 结果采样率 */
  sampleRate: number;
  /** 转换后的PCM结果 */
  data: Int16Array;
  /** 内部使用的 sum 值 */
  _sum?: number;
}

/** 滤波配置接口 */
export interface FilterConfig {
  /** 滤波函数 */
  fn?: ((sample: number) => number) | null;
  /** 原始采样率 */
  sr?: number;
  /** 新采样率 */
  srn?: number;
}

/** IIR滤波器嵌入配置 */
export interface IIRFilterEmbed {
  x1: number;
  x2: number;
  y1: number;
  y2: number;
  b0: number;
  b1: number;
  a1: number;
  a2: number;
}

/** IIR滤波器函数接口 */
export interface IIRFilterFunction {
  (x: number): number;
  Embed: IIRFilterEmbed;
}

/** 录音器静态方法接口 */
declare interface RecorderStatic {
  /** 版本信息 */
  LM: string;
  /** 缓冲大小 */
  BufferSize: number;
  /** 是否启用 WebM PCM 连接 */
  ConnectEnableWebM: boolean;
  /** 是否启用 AudioWorklet 连接 */
  ConnectEnableWorklet: boolean;
  /** 默认数据类型 */
  DefaultDataType?: 'blob' | 'arraybuffer';
  /** 流量统计图片URL */
  TrafficImgUrl: string;

  /** 创建录音器实例 */
  new (options?: RecorderOptions): RecorderInstance;
  /** 判断是否已打开全局麦克风 */
  IsOpen(): boolean;
  /** 销毁全局资源 */
  Destroy(): void;
  /** 绑定销毁处理方法 */
  BindDestroy(key: string, callback: () => void): void;
  /** 判断浏览器是否支持录音 */
  Support(): boolean;
  /** 获取 AudioContext */
  GetContext(tryNew?: boolean): AudioContext | null;
  /** 关闭新创建的 AudioContext */
  CloseNewCtx(ctx: AudioContext): void;
  /** 恢复 AudioContext 状态 */
  ResumeCtx(
    ctx: AudioContext,
    check: (count: number) => boolean,
    success: (count: number) => void,
    fail: (err: string) => void,
  ): void;
  /** 对PCM数据进行采样率转换 */
  SampleData(
    pcmDatas: (Int16Array | Float32Array)[],
    pcmSampleRate: number,
    newSampleRate: number,
    prevChunkInfo?: ChunkInfo,
    option?: SampleDataOption,
  ): ChunkInfo;
  /** IIR低通、高通滤波 */
  IIRFilter(useLowPass: boolean, sampleRate: number, freq: number): IIRFilterFunction;
  /** 计算音量百分比 */
  PowerLevel(pcmAbsSum: number, pcmLength: number): number;
  /** 计算音量 dBFS */
  PowerDBFS(maxSample: number): number;
  /** 日志输出 */
  CLog(msg: string, type?: number, ...args: unknown[]): void;
  /** 关闭音频流 */
  StopS_(stream: MediaStream): void;
  /** 流量统计 */
  Traffic(report?: string): void;
}

/** 全局 Recorder 声明 */
declare const Recorder: RecorderStatic;

/** 模块声明 */
declare module 'recorder-core' {
  const Recorder: RecorderStatic;
  export = Recorder;
}

lvzhenbo avatar Jul 08 '25 08:07 lvzhenbo

大佬,有没有TS调用的示例啊?

SheepYang1993 avatar Sep 10 '25 06:09 SheepYang1993

在tsconfig里面包含相关类型文件就行了,自动就有 @SheepYang1993

lvzhenbo avatar Sep 10 '25 06:09 lvzhenbo