UNPKG

lm-avatar-chat-sdk

Version:

lm avatar chat web sdk

694 lines (629 loc) 18.8 kB
import { default as AliRtcEngine } from 'aliyun-rtc-sdk'; import { AliRtcEngine as AliRtcEngine_2 } from 'aliyun-rtc-sdk'; import { AliRtcPublishState } from 'aliyun-rtc-sdk'; import { default as default_2 } from 'eventemitter3'; import { LogLevelDesc } from 'loglevel'; import { nanoid } from 'nanoid'; export { AliRtcEngine } export declare enum AliRtcOnByeType { /** 当前user被踢出channel */ AliRtcOnByeBeKickedOut = 1, /** channel已结束,需要离开会议 */ AliRtcOnByeChannelTerminated = 2, /** 相同userID在其他设备joinChannel,当前设备被下线 */ AliRtcOnByeUserReplaced = 3 } export declare enum ApplicationErrorCode { LinkChatServerFailed = 1120 } export declare enum ApplicationErrorMsg { LinkChatServerFailed = "Link chat server failed" } /** * 获取音频流数据的模式 * @enum */ declare enum AudioStreamMode { /** * 默认模式:通过RTC拉取音视频流 */ Default = 0, /** * 通过数据通道发送音频数据,接收端通过数据通道接收音频数据 */ DownFromDataChannel = 1 } export declare enum AvatarAction { Idle = "idle", Listening = "listen", Responding = "speak", Thinking = "think" } /** * 云端渲染数字人 */ export declare class CloudAvatar extends RtcAvatar { private _avatarVideoEle?; constructor(avatarConfig: IAvatarInitConfig); private _init; exit(): void; private _setupRTCView; start(dialogParams: IDialogConfig): Promise<void>; private _videoSubscribeStateChangedHandler; } /** * 创建数字人实例 * @param type 数字人类型 * @param avatarInitParams 数字人初始化参数 * @returns 数字人实例 */ export declare function createAvatar(type: TYAvatarType, avatarInitParams: IAvatarInitConfig, assetParams?: IAvatarAssetsConfig): CloudAvatar | LocalAvatar; export declare interface CustomTYWebsocketConfig { keepAlive?: boolean | number; protocols?: { 'avatar-id': string; 'model-id': string; 'x-fag-token': string; }; url: string; } export declare enum EventTypes { 'ErrorReceived' = "ErrorReceived", 'FirstFrameReceived' = "FirstFrameReceived", 'SpeakStarted' = "SpeakStarted", 'SpeakEnded' = "SpeakEnded", 'ResponseStarted' = "ResponseStarted", 'ResponseEnded' = "ResponseEnded", 'MessageReceived' = "MessageReceived", 'ReadyToSpeech' = "ReadyToSpeech", 'StateChanged' = "StateChanged", 'StatsReceived' = "StatsReceived", 'VolumeChanged' = "VolumeChanged" } export declare interface IAnimationConfig extends ISubAnimationConfig { other: { name: string; }[]; } export declare type IAvatarAction = 'hello' | 'idle' | 'listen' | 'speak' | 'think'; /** * 3D数字人初始化额外配置 * @interface */ export declare interface IAvatarAssetExt { /** * 是否开启阴影 */ enableShadow?: boolean; /** * 推理帧率 */ inferFps?: number; inferWasmPaths?: string; /** * 开启图片缓存,开启后,会降低渲染性能 */ preserveDrawingBuffer?: boolean; /** * 渲染性能模式 */ renderMode?: IRenderMode; /** * 垂直同步间隔 */ vsyncNum?: number; } export declare enum IAvatarAssetModelType { AVATAR_3D_TRADITIONAL = "AVATAR_3D_TRADITIONAL", AVATAR_LIVE2D = "AVATAR_LIVE2D", AVATAR_2D_MOBILE = "AVATAR_2D_MOBILE", GAUSSIAN_SPLATTING_3D = "GAUSSIAN_SPLATTING_3D" } export declare interface IAvatarAssetsConfig { url: string; license: string; secret: string; type?: IAvatarAssetModelType; } export declare enum IAvatarAudioFormat { f32 = "f32", opus = "opus", s16 = "s16" } export declare interface IAvatarInitConfig { appId: string; channel: string; timestamp: number; token: string; clientUserId: string; clientUserName?: string; serverUserId: string; avatarUserId: string; sessionId?: string; rootContainer: HTMLElement | string; } export declare interface IDialogConfig { mode: TYVoiceChatMode; keepAlive?: boolean; avatarAudioFormat?: IAvatarAudioFormat; outboundSampleRate?: IOutboundSampleRate; } /** trace: 详细的开发日志,用于追踪应用。 debug: 详细的开发信息,用于调试应用。 info: 重要事件的简要信息,如系统启动、配置等。 warn: 系统能正常运行,但有潜在错误的情况。 error: 由于严重的问题,某些功能无法正常运行。 slient: 静音,不再打印日志 */ export declare enum IEnv { dev = "dev", local = "local", pre = "pre", prod = "prod" } declare interface IMessage { action?: string; code?: number; event?: string; ext?: Record<string, unknown>; level: 'error' | 'warn' | 'info' | 'trace'; msg?: string; stack?: string; time?: string; } /** * @interface * 运动数据 */ export declare interface IMotionConfig { offset: Record<string, number>; scale: Record<string, number>; } export declare type IOutboundSampleRate = 48000 | 16000 | 24000; declare interface IPanel { dom: HTMLCanvasElement; key?: string; name: string; update: (value: number, maxValue: number) => void; } declare type IPayload = Record<string, string | number | object>; /** * 渲染性能模式 * @enum */ export declare enum IRenderMode { /** * 高性能 */ High = "High", /** * 低性能 */ Low = "Low", /** * 标准性能 */ Standard = "Standard" } export declare enum IRenderType { cloud = "cloud", local = "local" } export declare enum IRequestToRespondType { prompt = "prompt", transcript = "transcript" } /** * rtc加入房间参数 * @interface */ declare interface IRtcJoinRoomQuery { /** * rtc应用Id */ appId: string; /** * rtc频道 */ channelId: string; /** * rtc鉴权有效的时间戳 */ timestamp: number; /** * rtc鉴权相关的token */ token: string; /** * web端加入rtc的用户id */ userId: string; /** * web端加入rtc的用户名称 */ userName?: string; } declare interface ISpeech { audioData: Int8Array | Uint8Array; endOfTask: boolean; taskId: string; } export declare interface IStatsData { asrAtomDelay: number; asrAtomStopDelay: number; asrCompleteTime: number; avatarDelay: number; firstAudioTime: number; frdFirstTime: number; llmDelay: number; llmFirstTokenTime: number; llmRequestTime: number; respondingStartTime: number; totalDelay: number; ttsAtomDelay: number; ttsFirstByteTime: number; ttsFrdDelay: number; ttsTotalDelay: number; vadDelay: number; vadEndTime: number; } export declare type ISubAnimationConfig = { [key in IAvatarAction]: { isGroup: boolean; size: number; }; }; /** * 端测渲染(端到端)数字人 */ export declare class LocalAvatar extends RtcAvatar { private _processor; private _renderer?; private _avatarDivEle?; private _seq_id; private _renderExt; private _waitNextAudioClipCount; private _waitNextAudioClipTime?; private _renderModelType; private _assetConfig; static _canvas?: HTMLCanvasElement; constructor(avatarConfig: IAvatarInitConfig, assetConfig: IAvatarAssetsConfig); private _init; exit(): void; getArkitFaceFrame(): { arkitFace: {} | null; }; getTts2FaceFrame(): { tts2Face: Float32Array | null; }; interrupt(): void; sendSpeech(): void; private _setupRTCView; start(dialogParams: IDialogConfig): Promise<void>; private _render; private _bindEventTypes; protected _dataChannelMsgHandler(uid: string, msg: { data: ArrayBuffer; }): true | undefined; protected _dialogStateChangedHandler(payload: IPayload): void; } export declare class Logger { static setLevel(level: LogLevelDesc): void; static log(message: IMessage): void; static trace(message: Omit<IMessage, 'level'>): void; static info(message: Omit<IMessage, 'level'>): void; static warn(message: Omit<IMessage, 'level'>): void; static error(message: Omit<IMessage, 'level'>): void; } export { LogLevelDesc } export { nanoid } export declare enum PlayerEventTypes { 'Player_EndSpeaking' = "Player_EndSpeaking", 'Player_NoLegacy' = "Player_NoLegacy", 'Player_StartSpeaking' = "Player_StartSpeaking", 'Player_WaitNextAudioClip' = "Player_WaitNextAudioClip" } export declare enum ProcessorEventTypes { 'Change_Status' = "Change_Status", 'Chat_BinsizeError' = "Chat_BinsizeError" } /** * 基于WebSocket的单独输出数字人 */ export declare class PureAvatar extends default_2<PlayerEventTypes | WsEventTypes | RecEventTypes | EventTypes> { private _processor; private _avatarDivEle?; private _speechHandlerQueue; private _ws; private _curState; private _curServiceState?; private _renderer?; private _heartBeatTimer?; private _renderExt; private _renderModelType; private _wsConfig; private _assetConfig; constructor(wsConfig: TYWebsocketConfig, assetConfig: IAvatarAssetsConfig); private _init; changeState(state: TYVoiceChatState): void; exit(): void; getArkitFaceFrame(): { arkitFace: {} | null; }; getTts2FaceFrame(): { tts2Face: Float32Array | null; }; interrupt(): void; onErrorReceived(func: (err: TYError) => void): void; onFirstFrameReceived(func: () => void): void; onStateChanged(func: (state: TYVoiceChatState) => void): void; sendSpeech(options: ISpeech): void; private _setupRTCView; start(): Promise<void>; stopSpeech(): void; private _bindEventTypes; private _preCheckMsgError; private _messageHandler; private _heartBeat; private _render; } export declare enum RecEventTypes { 'REC_DATA' = "REC_DATA", 'REC_DATAHEADER' = "REC_DATAHEADER", 'REC_ERROR' = "REC_ERROR", 'REC_SESSION_STARTED' = "REC_SESSION_STARTED", 'REC_START' = "REC_START" } declare class Rtc { deviceMode: AudioStreamMode; private ee; engine?: AliRtcEngine_2; seiSupported: boolean; constructor(ee: default_2); init(deviceMode?: AudioStreamMode): Promise<AliRtcEngine | undefined>; joinRoom(query: IRtcJoinRoomQuery): Promise<void>; joinRoomAsLive(query: IRtcJoinRoomQuery): Promise<void>; leave(): void; muteLocalMic(mute: boolean): void; send(msg: string): void; private _audioVolumeHandler; } /** * 基于Aliyun RTC的数字人基类 */ export declare class RtcAvatar extends default_2<EventTypes | PlayerEventTypes | ProcessorEventTypes> { protected _curState: TYVoiceChatState; protected _isReadyTimer?: NodeJS.Timeout; protected _isReady: boolean; protected _localMicMuted: boolean; protected _rtc: Rtc; private _heartBeatTimer?; protected _deviceId?: string; protected _sessionId?: string; protected _avatarInitConfig?: IAvatarInitConfig; protected _dialogConfig: IDialogConfig; constructor(initConfig: IAvatarInitConfig, name?: string); setDialogConfig(dialogConfig: IDialogConfig): void; exit(): void; interrupt(): void; muteLocalMic(mute: boolean): void; onErrorReceived(func: (err: TYError) => void): void; onFirstFrameReceived(func: () => void): void; onMessageReceived(func: (msg: TYVoiceChatMessage) => void): void; onReadyToSpeech(func: () => void): void; onStateChanged(func: (state: TYVoiceChatState) => void): void; onVolumeChanged(func: (data: TYVolume) => void): void; onPerformanceInfoTrack(func: (data: TYPerformanceInfo) => void): void; requestToRespond(type: IRequestToRespondType, content: string): void; sendSpeech(): void; setLogLevel(level: LogLevelDesc): void; stopSpeech(): void; protected _dataPublishStateChangedHandler(oldState: AliRtcPublishState, newState: AliRtcPublishState): void; protected _dataChannelMsgHandler(uid: string, msg: { data: ArrayBuffer; }): any; protected _respondingEnded(): void; private _startedHandler; private _heartBeat; private _readyHandler; /** * 发送Start信号 * 需要根据不同渲染方式,确定发送Start信号的时间节点,所以提供函数供子类调用发送 */ protected sendStartSignal(renderType: IRenderType): void; protected startLinkDataChannel(): void; private _respondingStarted; private _respondingContent; private _speechStarted; private _speechEnded; private _speechContent; private _stopped; private _errorHandler; protected _avatarStateChangedHandler(payload: IPayload): void; protected _dialogStateChangedHandler(payload: IPayload): void; protected _timestampStatistics(payload: IPayload): void; } export declare enum RTCErrorCode { invalidAuthParams = 1000, authFailed = 1001, joinChannelFailed = 1002, dataChannelLostPackets = 1003, dataChannelBroken = 1004, channelDestroyed = 1005, rtcKickOff = 1006, dataChannelDelay = 1007 } export declare enum RTCErrorMsg { authFailed = "rtc auth failed", channelDestroyed = "channel destroyed", dataChannelBroken = "data channel broken", dataChannelDelay = "data channel delay", dataChannelLostPackets = "data channel lost packets", invalidAuthParams = "invalid auth params", joinChannelFailed = "rtc join channel failed", rtcKickOff = "rtc kick off" } export declare enum RTCEventTypes { audioVolume = "audioVolume", bye = "bye", dataChannelMsg = "dataChannelMsg", dataPublishStateChanged = "dataPublishStateChanged", localDeviceException = "localDeviceException", mediaExtensionMsgReceived = "mediaExtensionMsgReceived", onOccurError = "onOccurError", videoSubscribeStateChanged = "videoSubscribeStateChanged", rtcRemoteVideoStats = "rtcRemoteVideoStats", rtcRemoteAudioStats = "rtcRemoteAudioStats" } export declare class Stats { static Panel(name: string, fg: string, bg: string): { dom: HTMLCanvasElement; name: string; update: (value: number, maxValue: number) => void; }; beginTime: number; container: HTMLElement; fpsPanel?: IPanel; frames: number; memPanel?: IPanel; mode: number; msPanel?: IPanel; prevTime: number; statsArea: HTMLDivElement; voiceChatPanels: IPanel[]; constructor(); addPanel(panel: IPanel): IPanel; addPanels(panels: IPanel[]): IPanel[]; begin(): void; end(data?: IStatsData): number; hide(): void; show(): void; showPanel(id: number): void; update(data?: IStatsData): void; } export declare enum SystemErrorCode { RTCNoSupported = 1100, CameraUnauthorized = 1102, MicUnauthorized = 1103, AudioPublishFailed = 1104, VideoPublishFailed = 1105, UnknownError = 1106, UserActivationError = 1107 } export declare enum SystemErrorMsg { AudioPublishFailed = "Audio publish failed", CameraUnauthorized = "Camera unauthorized", MicUnauthorized = "Mic unauthorized", RTCNoSupported = "The current environment does not support WebRTC", UnknownError = "unknown error", UserActivationError = "\u5F53\u524D\u7F51\u9875\u672A\u5B58\u5728\u7528\u6237\u4EA4\u4E92\u884C\u4E3A\uFF0C\u9ED8\u8BA4\u4F1A\u88AB\u6D4F\u89C8\u5668\u62E6\u622A", VideoPublishFailed = "Video publish failed" } export declare interface TYAvatarAsset { avatarId?: string; ext?: IAvatarAssetExt; type?: number; } export declare enum TYAvatarType { cloudAvatar = "cloudAvatar", localAvatar = "localAvatar" } export declare interface TYError { code: RTCErrorCode | SystemErrorCode; error?: Error; message?: RTCErrorMsg | SystemErrorMsg; terminate?: boolean; } export declare interface TYPerformanceInfo { type: TYPerformanceInfoType; data: Record<string, string | number | Array<object>>; } export declare enum TYPerformanceInfoType { TimestampStatistics = "TimestampStatistics",// 时延统计 RemoteRtcAudioStats = "RemoteRtcAudioStats", RemoteRtcVideoStats = "RemoteRtcVideoStats" } export declare interface TYVoiceChatMessage { isFinished: boolean; text: string; type: TYVoiceChatMessageType; } export declare enum TYVoiceChatMessageType { speaking = 0, responding = 1 } export declare enum TYVoiceChatMode { duplex = "duplex", push2talk = "push2talk", tap2talk = "tap2talk" } export declare enum TYVoiceChatState { Idle = "Idle", Listening = "Listening", Responding = "Responding", Thinking = "Thinking" } export declare enum TYVoicePlatform { minimax = "minimax", nls = "nls" } export declare interface TYVolume { source: TYVolumeSourceType; volume: number; } export declare enum TYVolumeSourceType { mic = 0, player = 1 } export declare interface TYWebsocketConfig { avatarId: string; url: string; rootContainer: HTMLElement | string; keepAlive?: boolean | number; modelId: string; xFagToken: string; } /** * WebSocket错误码 * @enum */ export declare enum WSErrorCode { /** * 参数不规范 */ invalidParam = 400, /** * 服务内部错误 */ internalException = 500, /** * socket触发关闭 */ socketClosed = 700 } /** * WebSocket错误消息 * @enum */ export declare enum WSErrorMsg { /** * 服务内部错误 */ internalException = "aca.error.internal.exception", /** * 参数不规范 */ invalidParam = "aca.error.invalid.param", /** * socket触发关闭 */ socketClosed = "socket closed" } export declare enum WsEventTypes { 'WS_CLOSE' = "WS_CLOSE", 'WS_ERROR' = "WS_ERROR", 'WS_MESSAGE' = "WS_MESSAGE", 'WS_OPEN' = "WS_OPEN" } export { }