@lee-zg/melange 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/chunk-2PXWQDZC.js +659 -0
  4. package/dist/chunk-2PXWQDZC.js.map +1 -0
  5. package/dist/chunk-352XNR3C.js +716 -0
  6. package/dist/chunk-352XNR3C.js.map +1 -0
  7. package/dist/chunk-7QVYU63E.js +6 -0
  8. package/dist/chunk-7QVYU63E.js.map +1 -0
  9. package/dist/chunk-ALBD5XC5.js +285 -0
  10. package/dist/chunk-ALBD5XC5.js.map +1 -0
  11. package/dist/chunk-O7K662J5.cjs +842 -0
  12. package/dist/chunk-O7K662J5.cjs.map +1 -0
  13. package/dist/chunk-PK6SKIKE.cjs +8 -0
  14. package/dist/chunk-PK6SKIKE.cjs.map +1 -0
  15. package/dist/chunk-Q73NOVWX.cjs +789 -0
  16. package/dist/chunk-Q73NOVWX.cjs.map +1 -0
  17. package/dist/chunk-Q7XG6YN6.cjs +682 -0
  18. package/dist/chunk-Q7XG6YN6.cjs.map +1 -0
  19. package/dist/chunk-YGMBCZJQ.js +833 -0
  20. package/dist/chunk-YGMBCZJQ.js.map +1 -0
  21. package/dist/chunk-ZT6HVG4G.cjs +330 -0
  22. package/dist/chunk-ZT6HVG4G.cjs.map +1 -0
  23. package/dist/core/index.cjs +97 -0
  24. package/dist/core/index.cjs.map +1 -0
  25. package/dist/core/index.d.cts +718 -0
  26. package/dist/core/index.d.ts +718 -0
  27. package/dist/core/index.js +4 -0
  28. package/dist/core/index.js.map +1 -0
  29. package/dist/fp/index.cjs +185 -0
  30. package/dist/fp/index.cjs.map +1 -0
  31. package/dist/fp/index.d.cts +913 -0
  32. package/dist/fp/index.d.ts +913 -0
  33. package/dist/fp/index.js +4 -0
  34. package/dist/fp/index.js.map +1 -0
  35. package/dist/index.cjs +608 -0
  36. package/dist/index.cjs.map +1 -0
  37. package/dist/index.d.cts +39 -0
  38. package/dist/index.d.ts +39 -0
  39. package/dist/index.js +33 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/plugins/index.cjs +41 -0
  42. package/dist/plugins/index.cjs.map +1 -0
  43. package/dist/plugins/index.d.cts +643 -0
  44. package/dist/plugins/index.d.ts +643 -0
  45. package/dist/plugins/index.js +4 -0
  46. package/dist/plugins/index.js.map +1 -0
  47. package/dist/types-BtOUCLB-.d.cts +293 -0
  48. package/dist/types-BtOUCLB-.d.ts +293 -0
  49. package/dist/utils/index.cjs +297 -0
  50. package/dist/utils/index.cjs.map +1 -0
  51. package/dist/utils/index.d.cts +1179 -0
  52. package/dist/utils/index.d.ts +1179 -0
  53. package/dist/utils/index.js +4 -0
  54. package/dist/utils/index.js.map +1 -0
  55. package/package.json +132 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/speech/synthesis.ts","../src/plugins/speech/recognition.ts"],"names":["__name"],"mappings":"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","file":"chunk-O7K662J5.cjs","sourcesContent":["/**\r\n * @fileoverview 语音合成 (TTS) 实现\r\n * @module melange/plugins/speech/synthesis\r\n * @description 提供语音合成功能,支持浏览器原生 API 和第三方服务降级\r\n */\r\n\r\nimport type {\r\n SpeechProviderType,\r\n SpeechServiceStatus,\r\n SpeechError,\r\n VoiceInfo,\r\n SynthesisConfig,\r\n SynthesisEventType,\r\n SynthesisEvent,\r\n SynthesisEventHandler,\r\n SynthesisProvider,\r\n SpeechSynthesizer,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// 浏览器原生提供商实现\r\n// ============================================================================\r\n\r\n/**\r\n * 浏览器原生语音合成提供商\r\n * 使用 Web Speech API 的 SpeechSynthesis 接口\r\n */\r\nclass BrowserSynthesisProvider implements SynthesisProvider {\r\n readonly type: SpeechProviderType = 'browser';\r\n private synthesis: SpeechSynthesis | null = null;\r\n private eventHandlers: Map<SynthesisEventType, Set<SynthesisEventHandler>> = new Map();\r\n private voicesLoaded: boolean = false;\r\n private voicesPromise: Promise<VoiceInfo[]> | null = null;\r\n\r\n constructor() {\r\n if (this.isAvailable()) {\r\n this.synthesis = window.speechSynthesis;\r\n }\r\n }\r\n\r\n /**\r\n * 检查浏览器是否支持语音合成\r\n */\r\n isAvailable(): boolean {\r\n return typeof window !== 'undefined' && 'speechSynthesis' in window;\r\n }\r\n\r\n /**\r\n * 获取可用语音列表\r\n */\r\n async getVoices(): Promise<VoiceInfo[]> {\r\n if (!this.synthesis) {\r\n return [];\r\n }\r\n\r\n // 如果已经有加载中的 Promise,直接返回\r\n if (this.voicesPromise) {\r\n return this.voicesPromise;\r\n }\r\n\r\n this.voicesPromise = new Promise((resolve) => {\r\n const loadVoices = () => {\r\n const voices = this.synthesis!.getVoices();\r\n if (voices.length > 0) {\r\n this.voicesLoaded = true;\r\n resolve(\r\n voices.map((voice) => ({\r\n id: voice.voiceURI,\r\n name: voice.name,\r\n lang: voice.lang,\r\n localService: voice.localService,\r\n default: voice.default,\r\n provider: 'browser' as SpeechProviderType,\r\n }))\r\n );\r\n }\r\n };\r\n\r\n // 尝试立即获取\r\n loadVoices();\r\n\r\n // 如果没有获取到,监听 voiceschanged 事件\r\n if (!this.voicesLoaded) {\r\n this.synthesis!.addEventListener('voiceschanged', loadVoices, { once: true });\r\n // 设置超时,防止永久等待\r\n setTimeout(() => {\r\n if (!this.voicesLoaded) {\r\n resolve([]);\r\n }\r\n }, 3000);\r\n }\r\n });\r\n\r\n return this.voicesPromise;\r\n }\r\n\r\n /**\r\n * 朗读文本\r\n */\r\n async speak(text: string, config?: SynthesisConfig): Promise<void> {\r\n if (!this.synthesis) {\r\n throw this.createError('NOT_AVAILABLE', '浏览器不支持语音合成');\r\n }\r\n\r\n // 取消当前正在进行的朗读\r\n this.cancel();\r\n\r\n return new Promise((resolve, reject) => {\r\n const utterance = new SpeechSynthesisUtterance(text);\r\n\r\n // 应用配置\r\n if (config) {\r\n if (config.lang) utterance.lang = config.lang;\r\n if (config.volume !== undefined) utterance.volume = config.volume;\r\n if (config.rate !== undefined) utterance.rate = config.rate;\r\n if (config.pitch !== undefined) utterance.pitch = config.pitch;\r\n\r\n // 设置语音\r\n if (config.voice) {\r\n const voices = this.synthesis!.getVoices();\r\n const voiceConfig = config.voice;\r\n const targetVoice =\r\n typeof voiceConfig === 'string'\r\n ? voices.find((v) => v.name === voiceConfig || v.voiceURI === voiceConfig)\r\n : voices.find((v) => v.voiceURI === voiceConfig.id);\r\n if (targetVoice) {\r\n utterance.voice = targetVoice;\r\n }\r\n }\r\n }\r\n\r\n // 设置事件处理\r\n utterance.onstart = () => {\r\n this.emit('start', { type: 'start' });\r\n };\r\n\r\n utterance.onend = () => {\r\n this.emit('end', { type: 'end' });\r\n resolve();\r\n };\r\n\r\n utterance.onpause = () => {\r\n this.emit('pause', { type: 'pause' });\r\n };\r\n\r\n utterance.onresume = () => {\r\n this.emit('resume', { type: 'resume' });\r\n };\r\n\r\n utterance.onboundary = (event) => {\r\n this.emit('boundary', {\r\n type: 'boundary',\r\n charIndex: event.charIndex,\r\n charLength: event.charLength,\r\n elapsedTime: event.elapsedTime,\r\n name: event.name,\r\n });\r\n };\r\n\r\n utterance.onmark = (event) => {\r\n this.emit('mark', {\r\n type: 'mark',\r\n name: event.name,\r\n });\r\n };\r\n\r\n utterance.onerror = (event) => {\r\n const error = this.createError(event.error, `语音合成错误: ${event.error}`);\r\n this.emit('error', { type: 'error', error });\r\n reject(error);\r\n };\r\n\r\n this.synthesis!.speak(utterance);\r\n });\r\n }\r\n\r\n /**\r\n * 暂停朗读\r\n */\r\n pause(): void {\r\n if (this.synthesis && this.isSpeaking()) {\r\n this.synthesis.pause();\r\n }\r\n }\r\n\r\n /**\r\n * 继续朗读\r\n */\r\n resume(): void {\r\n if (this.synthesis && this.isPaused()) {\r\n this.synthesis.resume();\r\n }\r\n }\r\n\r\n /**\r\n * 取消朗读\r\n */\r\n cancel(): void {\r\n if (this.synthesis) {\r\n this.synthesis.cancel();\r\n }\r\n }\r\n\r\n /**\r\n * 是否正在朗读\r\n */\r\n isSpeaking(): boolean {\r\n return this.synthesis?.speaking ?? false;\r\n }\r\n\r\n /**\r\n * 是否已暂停\r\n */\r\n isPaused(): boolean {\r\n return this.synthesis?.paused ?? false;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: SynthesisEventType, event: SynthesisEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音合成事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 创建错误对象\r\n */\r\n private createError(code: string, message: string, originalError?: Error): SpeechError {\r\n const result: SpeechError = { code, message };\r\n if (originalError) {\r\n result.originalError = originalError;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 语音合成器主类\r\n// ============================================================================\r\n\r\n/**\r\n * 语音合成器\r\n * 管理多个提供商,支持自动降级\r\n */\r\nexport class SpeechSynthesizerImpl implements SpeechSynthesizer {\r\n private _currentProvider: SpeechProviderType = 'browser';\r\n private _status: SpeechServiceStatus = 'idle';\r\n private provider: SynthesisProvider | null = null;\r\n private config: SynthesisConfig = {};\r\n private eventHandlers: Map<SynthesisEventType, Set<SynthesisEventHandler>> = new Map();\r\n private providers: Map<SpeechProviderType, SynthesisProvider> = new Map();\r\n\r\n /**\r\n * 当前使用的提供商类型\r\n */\r\n get currentProvider(): SpeechProviderType {\r\n return this._currentProvider;\r\n }\r\n\r\n /**\r\n * 服务状态\r\n */\r\n get status(): SpeechServiceStatus {\r\n return this._status;\r\n }\r\n\r\n /**\r\n * 初始化语音合成器\r\n * @param config - 合成配置\r\n */\r\n async initialize(config?: SynthesisConfig): Promise<void> {\r\n this._status = 'loading';\r\n this.config = {\r\n lang: 'zh-CN',\r\n preferredProvider: 'browser',\r\n autoFallback: true,\r\n fallbackProviders: ['azure', 'google', 'aws'],\r\n ...config,\r\n };\r\n\r\n try {\r\n // 注册浏览器提供商\r\n const browserProvider = new BrowserSynthesisProvider();\r\n this.providers.set('browser', browserProvider);\r\n\r\n // 尝试使用首选提供商\r\n const preferredProvider = this.config.preferredProvider || 'browser';\r\n if (await this.tryProvider(preferredProvider)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n\r\n // 如果首选提供商不可用且启用了自动降级\r\n if (this.config.autoFallback && this.config.fallbackProviders) {\r\n for (const providerType of this.config.fallbackProviders) {\r\n if (await this.tryProvider(providerType)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // 所有提供商都不可用\r\n this._status = 'error';\r\n throw new Error('没有可用的语音合成提供商');\r\n } catch (error) {\r\n this._status = 'error';\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 尝试使用指定提供商\r\n */\r\n private async tryProvider(type: SpeechProviderType): Promise<boolean> {\r\n const provider = this.providers.get(type);\r\n if (provider && provider.isAvailable()) {\r\n this.provider = provider;\r\n this._currentProvider = type;\r\n\r\n // 转发提供商事件\r\n this.forwardProviderEvents(provider);\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 转发提供商事件到合成器\r\n */\r\n private forwardProviderEvents(provider: SynthesisProvider): void {\r\n const events: SynthesisEventType[] = [\r\n 'start',\r\n 'end',\r\n 'pause',\r\n 'resume',\r\n 'boundary',\r\n 'mark',\r\n 'error',\r\n ];\r\n events.forEach((event) => {\r\n provider.on(event, (e) => this.emit(event, e));\r\n });\r\n }\r\n\r\n /**\r\n * 获取可用语音列表\r\n */\r\n async getVoices(): Promise<VoiceInfo[]> {\r\n if (!this.provider) {\r\n throw new Error('语音合成器未初始化');\r\n }\r\n return this.provider.getVoices();\r\n }\r\n\r\n /**\r\n * 朗读文本\r\n * @param text - 要朗读的文本\r\n * @param config - 可选的合成配置\r\n */\r\n async speak(text: string, config?: SynthesisConfig): Promise<void> {\r\n if (!this.provider) {\r\n throw new Error('语音合成器未初始化');\r\n }\r\n\r\n const mergedConfig = { ...this.config, ...config };\r\n return this.provider.speak(text, mergedConfig);\r\n }\r\n\r\n /**\r\n * 暂停朗读\r\n */\r\n pause(): void {\r\n this.provider?.pause();\r\n }\r\n\r\n /**\r\n * 继续朗读\r\n */\r\n resume(): void {\r\n this.provider?.resume();\r\n }\r\n\r\n /**\r\n * 取消朗读\r\n */\r\n cancel(): void {\r\n this.provider?.cancel();\r\n }\r\n\r\n /**\r\n * 是否正在朗读\r\n */\r\n isSpeaking(): boolean {\r\n return this.provider?.isSpeaking() ?? false;\r\n }\r\n\r\n /**\r\n * 是否已暂停\r\n */\r\n isPaused(): boolean {\r\n return this.provider?.isPaused() ?? false;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: SynthesisEventType, event: SynthesisEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音合成事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 销毁实例\r\n */\r\n dispose(): void {\r\n this.cancel();\r\n this.eventHandlers.clear();\r\n this.provider = null;\r\n this._status = 'idle';\r\n }\r\n\r\n /**\r\n * 注册自定义提供商\r\n * @param type - 提供商类型\r\n * @param provider - 提供商实例\r\n */\r\n registerProvider(type: SpeechProviderType, provider: SynthesisProvider): void {\r\n this.providers.set(type, provider);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 工厂函数\r\n// ============================================================================\r\n\r\n/**\r\n * 创建语音合成器实例\r\n * @param config - 可选的合成配置\r\n * @returns 语音合成器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * // 创建并初始化语音合成器\r\n * const synthesizer = await createSpeechSynthesizer({\r\n * lang: 'zh-CN',\r\n * rate: 1.0,\r\n * pitch: 1.0,\r\n * });\r\n *\r\n * // 朗读文本\r\n * await synthesizer.speak('你好,世界!');\r\n *\r\n * // 监听事件\r\n * synthesizer.on('end', () => {\r\n * console.log('朗读完成');\r\n * });\r\n *\r\n * // 销毁\r\n * synthesizer.dispose();\r\n * ```\r\n */\r\nexport async function createSpeechSynthesizer(\r\n config?: SynthesisConfig\r\n): Promise<SpeechSynthesizer> {\r\n const synthesizer = new SpeechSynthesizerImpl();\r\n await synthesizer.initialize(config);\r\n return synthesizer;\r\n}\r\n\r\n/**\r\n * 检查当前环境是否支持语音合成\r\n * @returns 是否支持语音合成\r\n */\r\nexport function isSpeechSynthesisSupported(): boolean {\r\n return typeof window !== 'undefined' && 'speechSynthesis' in window;\r\n}\r\n\r\n/**\r\n * 快速朗读文本(一次性使用)\r\n * @param text - 要朗读的文本\r\n * @param config - 可选的合成配置\r\n *\r\n * @example\r\n * ```typescript\r\n * // 快速朗读\r\n * await speak('你好,世界!');\r\n *\r\n * // 带配置的朗读\r\n * await speak('Hello World', { lang: 'en-US', rate: 0.8 });\r\n * ```\r\n */\r\nexport async function speak(text: string, config?: SynthesisConfig): Promise<void> {\r\n if (!isSpeechSynthesisSupported()) {\r\n throw new Error('当前环境不支持语音合成');\r\n }\r\n\r\n const synthesizer = await createSpeechSynthesizer(config);\r\n try {\r\n await synthesizer.speak(text, config);\r\n } finally {\r\n synthesizer.dispose();\r\n }\r\n}\r\n","/**\r\n * @fileoverview 语音识别 (STT) 实现\r\n * @module melange/plugins/speech/recognition\r\n * @description 提供语音识别功能,支持浏览器原生 API 和第三方服务降级\r\n */\r\n\r\nimport type {\r\n SpeechProviderType,\r\n SpeechServiceStatus,\r\n SpeechError,\r\n RecognitionConfig,\r\n RecognitionEventType,\r\n RecognitionEvent,\r\n RecognitionEventHandler,\r\n RecognitionProvider,\r\n SpeechRecognizer,\r\n RecognitionResult,\r\n RecognitionResultItem,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// 浏览器原生提供商实现\r\n// ============================================================================\r\n\r\n// ============================================================================\r\n// 浏览器 Speech Recognition API 类型声明\r\n// ============================================================================\r\n\r\n/**\r\n * SpeechRecognition 结果列表接口\r\n */\r\ninterface BrowserSpeechRecognitionResultList {\r\n readonly length: number;\r\n item(index: number): BrowserSpeechRecognitionResult | null;\r\n [index: number]: BrowserSpeechRecognitionResult;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 结果接口\r\n */\r\ninterface BrowserSpeechRecognitionResult {\r\n readonly length: number;\r\n readonly isFinal: boolean;\r\n item(index: number): BrowserSpeechRecognitionAlternative | null;\r\n [index: number]: BrowserSpeechRecognitionAlternative;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 备选结果接口\r\n */\r\ninterface BrowserSpeechRecognitionAlternative {\r\n readonly transcript: string;\r\n readonly confidence: number;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 事件接口\r\n */\r\ninterface BrowserSpeechRecognitionEvent {\r\n readonly results: BrowserSpeechRecognitionResultList;\r\n readonly resultIndex: number;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 错误事件接口\r\n */\r\ninterface BrowserSpeechRecognitionErrorEvent {\r\n readonly error: string;\r\n readonly message: string;\r\n}\r\n\r\n/**\r\n * 浏览器原生 SpeechRecognition 接口\r\n */\r\ninterface BrowserSpeechRecognition extends EventTarget {\r\n lang: string;\r\n continuous: boolean;\r\n interimResults: boolean;\r\n maxAlternatives: number;\r\n start(): void;\r\n stop(): void;\r\n abort(): void;\r\n onstart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onresult: ((this: BrowserSpeechRecognition, ev: BrowserSpeechRecognitionEvent) => void) | null;\r\n onerror: ((this: BrowserSpeechRecognition, ev: BrowserSpeechRecognitionErrorEvent) => void) | null;\r\n onsoundstart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onsoundend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onspeechstart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onspeechend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onaudiostart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onaudioend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onnomatch: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 构造函数类型\r\n */\r\ninterface BrowserSpeechRecognitionConstructor {\r\n new (): BrowserSpeechRecognition;\r\n}\r\n\r\n// 声明 window 对象上的 SpeechRecognition\r\ndeclare global {\r\n interface Window {\r\n SpeechRecognition?: BrowserSpeechRecognitionConstructor;\r\n webkitSpeechRecognition?: BrowserSpeechRecognitionConstructor;\r\n }\r\n}\r\n\r\n/**\r\n * 获取浏览器的 SpeechRecognition 构造函数\r\n */\r\nfunction getSpeechRecognitionConstructor(): BrowserSpeechRecognitionConstructor | null {\r\n if (typeof window === 'undefined') {\r\n return null;\r\n }\r\n return window.SpeechRecognition || window.webkitSpeechRecognition || null;\r\n}\r\n\r\n/**\r\n * 浏览器原生语音识别提供商\r\n * 使用 Web Speech API 的 SpeechRecognition 接口\r\n */\r\nclass BrowserRecognitionProvider implements RecognitionProvider {\r\n readonly type: SpeechProviderType = 'browser';\r\n private recognition: BrowserSpeechRecognition | null = null;\r\n private eventHandlers: Map<RecognitionEventType, Set<RecognitionEventHandler>> = new Map();\r\n private _isListening: boolean = false;\r\n private SpeechRecognitionClass: BrowserSpeechRecognitionConstructor | null = null;\r\n\r\n constructor() {\r\n this.SpeechRecognitionClass = getSpeechRecognitionConstructor();\r\n }\r\n\r\n /**\r\n * 检查浏览器是否支持语音识别\r\n */\r\n isAvailable(): boolean {\r\n return this.SpeechRecognitionClass !== null;\r\n }\r\n\r\n /**\r\n * 开始语音识别\r\n */\r\n async start(config?: RecognitionConfig): Promise<void> {\r\n if (!this.SpeechRecognitionClass) {\r\n throw this.createError('NOT_AVAILABLE', '浏览器不支持语音识别');\r\n }\r\n\r\n // 如果已经在监听,先停止\r\n if (this._isListening) {\r\n this.stop();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this.recognition = new this.SpeechRecognitionClass!();\r\n\r\n // 应用配置\r\n if (config) {\r\n if (config.lang) this.recognition.lang = config.lang;\r\n if (config.continuous !== undefined) this.recognition.continuous = config.continuous;\r\n if (config.interimResults !== undefined) {\r\n this.recognition.interimResults = config.interimResults;\r\n }\r\n if (config.maxAlternatives !== undefined) {\r\n this.recognition.maxAlternatives = config.maxAlternatives;\r\n }\r\n }\r\n\r\n // 设置事件处理\r\n this.recognition.onstart = () => {\r\n this._isListening = true;\r\n this.emit('start', { type: 'start' });\r\n resolve();\r\n };\r\n\r\n this.recognition.onend = () => {\r\n this._isListening = false;\r\n this.emit('end', { type: 'end' });\r\n };\r\n\r\n this.recognition.onresult = (event) => {\r\n const results = this.convertResults(event.results);\r\n this.emit('result', { type: 'result', result: results });\r\n };\r\n\r\n this.recognition.onerror = (event) => {\r\n const error = this.createError(event.error, this.getErrorMessage(event.error));\r\n this._isListening = false;\r\n this.emit('error', { type: 'error', error });\r\n\r\n // 如果还没启动就出错,reject Promise\r\n if (event.error === 'not-allowed' || event.error === 'no-speech') {\r\n reject(error);\r\n }\r\n };\r\n\r\n this.recognition.onsoundstart = () => {\r\n this.emit('soundstart', { type: 'soundstart' });\r\n };\r\n\r\n this.recognition.onsoundend = () => {\r\n this.emit('soundend', { type: 'soundend' });\r\n };\r\n\r\n this.recognition.onspeechstart = () => {\r\n this.emit('speechstart', { type: 'speechstart' });\r\n };\r\n\r\n this.recognition.onspeechend = () => {\r\n this.emit('speechend', { type: 'speechend' });\r\n };\r\n\r\n this.recognition.onaudiostart = () => {\r\n this.emit('audiostart', { type: 'audiostart' });\r\n };\r\n\r\n this.recognition.onaudioend = () => {\r\n this.emit('audioend', { type: 'audioend' });\r\n };\r\n\r\n this.recognition.onnomatch = () => {\r\n this.emit('nomatch', { type: 'nomatch' });\r\n };\r\n\r\n // 启动识别\r\n try {\r\n this.recognition.start();\r\n } catch (e) {\r\n const error = this.createError('START_ERROR', '启动语音识别失败', e as Error);\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 转换识别结果\r\n */\r\n private convertResults(results: BrowserSpeechRecognitionResultList): RecognitionResult {\r\n const items: RecognitionResultItem[] = [];\r\n let bestTranscript = '';\r\n let bestConfidence = 0;\r\n let isFinal = false;\r\n\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i];\r\n if (!result) continue;\r\n isFinal = isFinal || result.isFinal;\r\n\r\n for (let j = 0; j < result.length; j++) {\r\n const alternative = result[j];\r\n if (!alternative) continue;\r\n items.push({\r\n transcript: alternative.transcript,\r\n confidence: alternative.confidence,\r\n isFinal: result.isFinal,\r\n });\r\n\r\n // 更新最佳结果\r\n if (alternative.confidence > bestConfidence) {\r\n bestConfidence = alternative.confidence;\r\n bestTranscript = alternative.transcript;\r\n }\r\n }\r\n }\r\n\r\n // 如果没有置信度信息,使用第一个结果\r\n if (bestTranscript === '' && items.length > 0) {\r\n const firstItem = items[0];\r\n if (firstItem) {\r\n bestTranscript = firstItem.transcript;\r\n bestConfidence = firstItem.confidence || 1;\r\n }\r\n }\r\n\r\n return {\r\n results: items,\r\n bestTranscript,\r\n bestConfidence,\r\n isFinal,\r\n };\r\n }\r\n\r\n /**\r\n * 获取错误消息\r\n */\r\n private getErrorMessage(errorCode: string): string {\r\n const errorMessages: Record<string, string> = {\r\n 'no-speech': '未检测到语音输入',\r\n 'audio-capture': '无法访问麦克风',\r\n 'not-allowed': '麦克风权限被拒绝',\r\n network: '网络错误',\r\n aborted: '识别被中止',\r\n 'language-not-supported': '不支持的语言',\r\n 'service-not-allowed': '语音服务不可用',\r\n 'bad-grammar': '语法错误',\r\n };\r\n return errorMessages[errorCode] || `语音识别错误: ${errorCode}`;\r\n }\r\n\r\n /**\r\n * 停止语音识别\r\n */\r\n stop(): void {\r\n if (this.recognition && this._isListening) {\r\n this.recognition.stop();\r\n }\r\n }\r\n\r\n /**\r\n * 中止语音识别\r\n */\r\n abort(): void {\r\n if (this.recognition) {\r\n this.recognition.abort();\r\n this._isListening = false;\r\n }\r\n }\r\n\r\n /**\r\n * 是否正在监听\r\n */\r\n isListening(): boolean {\r\n return this._isListening;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: RecognitionEventType, event: RecognitionEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音识别事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 创建错误对象\r\n */\r\n private createError(code: string, message: string, originalError?: Error): SpeechError {\r\n const result: SpeechError = { code, message };\r\n if (originalError) {\r\n result.originalError = originalError;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 语音识别器主类\r\n// ============================================================================\r\n\r\n/**\r\n * 语音识别器\r\n * 管理多个提供商,支持自动降级\r\n */\r\nexport class SpeechRecognizerImpl implements SpeechRecognizer {\r\n private _currentProvider: SpeechProviderType = 'browser';\r\n private _status: SpeechServiceStatus = 'idle';\r\n private provider: RecognitionProvider | null = null;\r\n private config: RecognitionConfig = {};\r\n private eventHandlers: Map<RecognitionEventType, Set<RecognitionEventHandler>> = new Map();\r\n private providers: Map<SpeechProviderType, RecognitionProvider> = new Map();\r\n\r\n /**\r\n * 当前使用的提供商类型\r\n */\r\n get currentProvider(): SpeechProviderType {\r\n return this._currentProvider;\r\n }\r\n\r\n /**\r\n * 服务状态\r\n */\r\n get status(): SpeechServiceStatus {\r\n return this._status;\r\n }\r\n\r\n /**\r\n * 初始化语音识别器\r\n * @param config - 识别配置\r\n */\r\n async initialize(config?: RecognitionConfig): Promise<void> {\r\n this._status = 'loading';\r\n this.config = {\r\n lang: 'zh-CN',\r\n continuous: false,\r\n interimResults: true,\r\n maxAlternatives: 1,\r\n preferredProvider: 'browser',\r\n autoFallback: true,\r\n fallbackProviders: ['azure', 'google', 'aws'],\r\n ...config,\r\n };\r\n\r\n try {\r\n // 注册浏览器提供商\r\n const browserProvider = new BrowserRecognitionProvider();\r\n this.providers.set('browser', browserProvider);\r\n\r\n // 尝试使用首选提供商\r\n const preferredProvider = this.config.preferredProvider || 'browser';\r\n if (await this.tryProvider(preferredProvider)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n\r\n // 如果首选提供商不可用且启用了自动降级\r\n if (this.config.autoFallback && this.config.fallbackProviders) {\r\n for (const providerType of this.config.fallbackProviders) {\r\n if (await this.tryProvider(providerType)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // 所有提供商都不可用\r\n this._status = 'error';\r\n throw new Error('没有可用的语音识别提供商');\r\n } catch (error) {\r\n this._status = 'error';\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 尝试使用指定提供商\r\n */\r\n private async tryProvider(type: SpeechProviderType): Promise<boolean> {\r\n const provider = this.providers.get(type);\r\n if (provider && provider.isAvailable()) {\r\n this.provider = provider;\r\n this._currentProvider = type;\r\n\r\n // 转发提供商事件\r\n this.forwardProviderEvents(provider);\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 转发提供商事件到识别器\r\n */\r\n private forwardProviderEvents(provider: RecognitionProvider): void {\r\n const events: RecognitionEventType[] = [\r\n 'start',\r\n 'end',\r\n 'result',\r\n 'error',\r\n 'soundstart',\r\n 'soundend',\r\n 'speechstart',\r\n 'speechend',\r\n 'audiostart',\r\n 'audioend',\r\n 'nomatch',\r\n ];\r\n events.forEach((event) => {\r\n provider.on(event, (e) => this.emit(event, e));\r\n });\r\n }\r\n\r\n /**\r\n * 开始语音识别\r\n * @param config - 可选的识别配置\r\n */\r\n async start(config?: RecognitionConfig): Promise<void> {\r\n if (!this.provider) {\r\n throw new Error('语音识别器未初始化');\r\n }\r\n\r\n const mergedConfig = { ...this.config, ...config };\r\n return this.provider.start(mergedConfig);\r\n }\r\n\r\n /**\r\n * 停止语音识别\r\n */\r\n stop(): void {\r\n this.provider?.stop();\r\n }\r\n\r\n /**\r\n * 中止语音识别\r\n */\r\n abort(): void {\r\n this.provider?.abort();\r\n }\r\n\r\n /**\r\n * 是否正在监听\r\n */\r\n isListening(): boolean {\r\n return this.provider?.isListening() ?? false;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: RecognitionEventType, event: RecognitionEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音识别事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 销毁实例\r\n */\r\n dispose(): void {\r\n this.abort();\r\n this.eventHandlers.clear();\r\n this.provider = null;\r\n this._status = 'idle';\r\n }\r\n\r\n /**\r\n * 注册自定义提供商\r\n * @param type - 提供商类型\r\n * @param provider - 提供商实例\r\n */\r\n registerProvider(type: SpeechProviderType, provider: RecognitionProvider): void {\r\n this.providers.set(type, provider);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 工厂函数\r\n// ============================================================================\r\n\r\n/**\r\n * 创建语音识别器实例\r\n * @param config - 可选的识别配置\r\n * @returns 语音识别器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * // 创建并初始化语音识别器\r\n * const recognizer = await createSpeechRecognizer({\r\n * lang: 'zh-CN',\r\n * continuous: true,\r\n * interimResults: true,\r\n * });\r\n *\r\n * // 监听识别结果\r\n * recognizer.on('result', (event) => {\r\n * if (event.result) {\r\n * console.log('识别结果:', event.result.bestTranscript);\r\n * }\r\n * });\r\n *\r\n * // 开始识别\r\n * await recognizer.start();\r\n *\r\n * // 停止识别\r\n * recognizer.stop();\r\n *\r\n * // 销毁\r\n * recognizer.dispose();\r\n * ```\r\n */\r\nexport async function createSpeechRecognizer(\r\n config?: RecognitionConfig\r\n): Promise<SpeechRecognizer> {\r\n const recognizer = new SpeechRecognizerImpl();\r\n await recognizer.initialize(config);\r\n return recognizer;\r\n}\r\n\r\n/**\r\n * 检查当前环境是否支持语音识别\r\n * @returns 是否支持语音识别\r\n */\r\nexport function isSpeechRecognitionSupported(): boolean {\r\n return getSpeechRecognitionConstructor() !== null;\r\n}\r\n\r\n/**\r\n * 快速进行一次语音识别\r\n * @param config - 可选的识别配置\r\n * @returns 识别结果\r\n *\r\n * @example\r\n * ```typescript\r\n * // 进行一次语音识别\r\n * const result = await listen({ lang: 'zh-CN' });\r\n * console.log('识别结果:', result.bestTranscript);\r\n * ```\r\n */\r\nexport async function listen(config?: RecognitionConfig): Promise<RecognitionResult> {\r\n if (!isSpeechRecognitionSupported()) {\r\n throw new Error('当前环境不支持语音识别');\r\n }\r\n\r\n const recognizer = await createSpeechRecognizer({\r\n ...config,\r\n continuous: false,\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n recognizer.on('result', (event) => {\r\n if (event.result && event.result.isFinal) {\r\n recognizer.dispose();\r\n resolve(event.result);\r\n }\r\n });\r\n\r\n recognizer.on('error', (event) => {\r\n recognizer.dispose();\r\n reject(event.error);\r\n });\r\n\r\n recognizer.on('end', () => {\r\n // 如果结束时还没有结果,返回空结果\r\n recognizer.dispose();\r\n resolve({\r\n results: [],\r\n bestTranscript: '',\r\n bestConfidence: 0,\r\n isFinal: true,\r\n });\r\n });\r\n\r\n recognizer.start().catch(reject);\r\n });\r\n}\r\n"]}
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
+
6
+ exports.__name = __name;
7
+ //# sourceMappingURL=chunk-PK6SKIKE.cjs.map
8
+ //# sourceMappingURL=chunk-PK6SKIKE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-PK6SKIKE.cjs"}