import { ipcRenderer } from "electron"; /** * 阿里云语音服务 - 渲染进程API */ export default { cosyvoice: { /** * 语音合成 */ async synthesize(params: { text: string; config: { apiKey: string; model: string; voice: string; format?: string; sampleRate?: number; saveToPreCache?: string; // 如果提供了voiceId,自动保存到预缓存目录 }; }) { return await ipcRenderer.invoke('aliyun:cosyvoice:synthesize', params); }, /** * 获取可用音色列表 */ async getVoices(model: string) { return await ipcRenderer.invoke('aliyun:cosyvoice:getVoices', model); }, /** * 预缓存所有系统默认音色 */ async preCacheSystemVoices(apiKey: string, force: boolean = false) { return await ipcRenderer.invoke('aliyun:cosyvoice:preCacheSystemVoices', { apiKey, force }); }, /** * 获取预缓存的音色路径 */ async getPreCachedVoicePath(voiceId: string) { return await ipcRenderer.invoke('aliyun:cosyvoice:getPreCachedVoicePath', voiceId); }, /** * 检查所有音色是否已缓存 */ async isAllVoicesCached() { return await ipcRenderer.invoke('aliyun:cosyvoice:isAllVoicesCached'); }, /** * 清除预缓存 */ async clearPreCache() { return await ipcRenderer.invoke('aliyun:cosyvoice:clearPreCache'); } }, funasr: { /** * 语音识别(本地文件,自动上传到 OSS) */ async recognize(params: { audioPath: string; config: { apiKey: string; ossConfig?: { accessKeyId: string; accessKeySecret: string; bucket: string; region: string; endpoint?: string; }; model?: string; }; }) { return await ipcRenderer.invoke('aliyun:funasr:recognize', params); }, /** * 语音识别(直接使用 URL,无需上传 OSS) */ async recognizeFromUrl(params: { audioUrl: string; apiKey: string; }) { return await ipcRenderer.invoke('aliyun:funasr:recognizeFromUrl', params); }, /** * 检测音频格式 */ async detectFormat(audioPath: string) { return await ipcRenderer.invoke('aliyun:funasr:detectFormat', audioPath); } }, audio: { /** * 检测音频中的声音片段(基于音量) */ async detectVolume(params: { audioPath: string; config?: { silenceThreshold?: number; // 静音阈值(dB),默认 -40dB minSilenceDuration?: number; // 最小静音时长(秒),默认 0.5s minSoundDuration?: number; // 最小有声时长(秒),默认 0.3s }; }) { return await ipcRenderer.invoke('audio:detectVolume', params); }, /** * 根据音频片段分配文本时间 */ async allocateText(params: { text: string; segments: Array<{ startTime: number; endTime: number; duration: number; }>; }) { return await ipcRenderer.invoke('audio:allocateText', params); } } };