feat: 语音

This commit is contained in:
电摇小子
2026-08-05 09:45:59 +08:00
committed by Wxw-Gu
parent 69bc6f57e7
commit 7529a67f09
49 changed files with 3013 additions and 154 deletions
+15
View File
@@ -45,6 +45,13 @@ import type { AppLogEntry } from '../shared/app-log'
import type { AppUpdateCheckResult, AppUpdateState } from '../shared/app-update'
import type { CacheSummary } from '../shared/cache'
import type { ExportRequest, ExportJobProgress, ExportResult } from '../shared/export'
import type {
VoiceMessageReference,
VoiceModelDownloadResult,
VoiceModelProgressEvent,
VoiceModelStatus,
VoiceRecognitionResult
} from '../shared/voice-recognition'
export type ParsedContent =
| { type: 'text'; content: string }
@@ -205,6 +212,14 @@ declare global {
createTime: number,
svrId?: string | number
) => Promise<{ success: boolean; data?: string; error?: string }>
getVoiceModelStatus: () => Promise<VoiceModelStatus>
downloadVoiceModel: () => Promise<VoiceModelDownloadResult>
cancelVoiceModelDownload: () => Promise<{ success: boolean }>
removeVoiceModel: () => Promise<VoiceModelStatus>
openVoiceModelDirectory: () => Promise<{ success: boolean; error?: string }>
recognizeVoice: (reference: VoiceMessageReference) => Promise<VoiceRecognitionResult>
cancelVoiceRecognition: (reference: VoiceMessageReference) => Promise<{ success: boolean }>
onVoiceModelProgress: (callback: (status: VoiceModelProgressEvent) => void) => () => void
parseMessage: (content: string, messageType: number) => Promise<ParsedContent>
getImage: (
imageMd5?: string,
+25
View File
@@ -22,6 +22,13 @@ import type { CacheSummary } from '../shared/cache'
import type { ExportRequest, ExportJobProgress } from '../shared/export'
import type { ImageDecoderSelectionResult, ImageDecoderStatus } from '../shared/image-decryption'
import type { AccountDiscoveryResult } from '../shared/database-key'
import type {
VoiceMessageReference,
VoiceModelDownloadResult,
VoiceModelProgressEvent,
VoiceModelStatus,
VoiceRecognitionResult
} from '../shared/voice-recognition'
// 渲染器的自定义 API
const api = {
@@ -74,6 +81,24 @@ const api = {
copyImage: (base64String) => ipcRenderer.invoke('copy-image', base64String),
getVoiceData: (sessionId: string, localId: number, createTime: number, svrId?: string | number) =>
ipcRenderer.invoke('db:getVoiceData', sessionId, localId, createTime, svrId),
getVoiceModelStatus: (): Promise<VoiceModelStatus> => ipcRenderer.invoke('voice:getModelStatus'),
downloadVoiceModel: (): Promise<VoiceModelDownloadResult> =>
ipcRenderer.invoke('voice:downloadModel'),
cancelVoiceModelDownload: (): Promise<{ success: boolean }> =>
ipcRenderer.invoke('voice:cancelModelDownload'),
removeVoiceModel: (): Promise<VoiceModelStatus> => ipcRenderer.invoke('voice:removeModel'),
openVoiceModelDirectory: (): Promise<{ success: boolean; error?: string }> =>
ipcRenderer.invoke('voice:openModelDirectory'),
recognizeVoice: (reference: VoiceMessageReference): Promise<VoiceRecognitionResult> =>
ipcRenderer.invoke('voice:recognize', reference),
cancelVoiceRecognition: (reference: VoiceMessageReference): Promise<{ success: boolean }> =>
ipcRenderer.invoke('voice:cancelRecognition', reference),
onVoiceModelProgress: (callback: (status: VoiceModelProgressEvent) => void) => {
const listener = (_event: Electron.IpcRendererEvent, status: VoiceModelProgressEvent): void =>
callback(status)
ipcRenderer.on('voice:modelProgress', listener)
return () => ipcRenderer.removeListener('voice:modelProgress', listener)
},
parseMessage: (content: string, messageType: number) =>
ipcRenderer.invoke('db:parseMessage', content, messageType),
getImage: (