import React, { useState, useEffect } from 'react' import { Download, X, CheckCircle, AlertCircle } from 'lucide-react' import './VoiceTranscribeDialog.scss' interface VoiceTranscribeDialogProps { onClose: () => void onDownloadComplete: () => void } export const VoiceTranscribeDialog: React.FC = ({ onClose, onDownloadComplete }) => { const [isDownloading, setIsDownloading] = useState(false) const [downloadProgress, setDownloadProgress] = useState(0) const [downloadError, setDownloadError] = useState(null) const [isComplete, setIsComplete] = useState(false) useEffect(() => { // 监听下载进度 if (!window.electronAPI?.whisper?.onDownloadProgress) { console.warn('[VoiceTranscribeDialog] whisper API 不可用') return } const removeListener = window.electronAPI.whisper.onDownloadProgress((payload: { modelName: string; downloadedBytes: number; totalBytes?: number; percent?: number }) => { if (payload.percent !== undefined) { setDownloadProgress(payload.percent) } }) return () => { removeListener?.() } }, []) const handleDownload = async () => { if (!window.electronAPI?.whisper?.downloadModel) { setDownloadError('语音转文字功能不可用') return } setIsDownloading(true) setDownloadError(null) setDownloadProgress(0) try { const result = await window.electronAPI.whisper.downloadModel() if (result?.success) { setIsComplete(true) setDownloadProgress(100) // 延迟关闭弹窗并触发转写 setTimeout(() => { onDownloadComplete() }, 1000) } else { setDownloadError(result?.error || '下载失败') setIsDownloading(false) } } catch (error) { setDownloadError(String(error)) setIsDownloading(false) } } const handleCancel = () => { if (!isDownloading && !isComplete) { onClose() } } return (
e.stopPropagation()}>

语音转文字

{!isDownloading && !isComplete && ( )}
{!isDownloading && !isComplete && ( <>

首次使用语音转文字功能需要下载 AI 模型

模型名称: SenseVoiceSmall
文件大小: 约 240 MB
支持语言: 中文、粤语、英文、日文、韩文
{downloadError && (
{downloadError}
)}
)} {isDownloading && !isComplete && (

{downloadProgress < 1 ? '正在连接服务器...' : '正在下载模型...'}

{downloadProgress.toFixed(1)}%

{downloadProgress < 1 && (

首次连接可能需要较长时间,请耐心等待

)}
)} {isComplete && (

下载完成!正在转写语音...

)}
) }