%% 语音识别转文字 — 类图 classDiagram class Wx { <> +config(options: WxConfigOptions) void +ready(callback: Function) void +error(callback: Function) void +startRecord() void +stopRecord(options: object) void +translateVoice(options: object) void } class JsapiConfig { +corp_id: string +agent_id: string +timestamp: number +nonce_str: string +signature: string } class UseWecomVoiceReturn { +state: VoiceState +init() Promise~void~ +startRecording() Promise~void~ +stopAndTranslate() Promise~string~ +isSupported() boolean } class VoiceState { +isReady: boolean +isRecording: boolean +isTranslating: boolean +error: string|null } class SpeechRecognition { <> +lang: string +continuous: boolean +interimResults: boolean +start() void +stop() void +abort() void +onresult: Function +onerror: Function +onend: Function } class UseSpeechRecognitionReturn { +state: SpeechState +start() void +stop() void +reset() void } class SpeechState { +isListening: boolean +interimText: string +finalText: string +error: string|null +isSupported: boolean } class InputBar { +inputText: string +handleVoiceStart() void +handleVoiceEnd() void } class ReplyBox { +inputText: string +toggleVoice() void } UseWecomVoiceReturn --> VoiceState UseWecomVoiceReturn ..> Wx : uses UseWecomVoiceReturn ..> JsapiConfig : fetches InputBar --> UseWecomVoiceReturn : composes UseSpeechRecognitionReturn --> SpeechState UseSpeechRecognitionReturn ..> SpeechRecognition : wraps ReplyBox --> UseSpeechRecognitionReturn : composes