From 760c01d79ee138f16d20706097987806303f979f Mon Sep 17 00:00:00 2001 From: himeditator mac Date: Tue, 15 Jul 2025 13:52:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(engine):=20=E6=B7=BB=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E5=B9=95=E5=BC=95=E6=93=8E=E8=B5=84=E6=BA=90=E6=B6=88=E8=80=97?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在控制窗口添加引擎状态显示,包括 PID、PPID、CPU 使用率、内存使用量和运行时间 - 优化字幕记录导出和复制功能,支持选择导出内容类型 --- docs/TODO.md | 3 +- docs/api-docs/electron-ipc.md | 13 ++++ package-lock.json | 14 +++- package.json | 1 + src/main/ControlWindow.ts | 16 +++++ src/main/types/index.ts | 8 +++ src/renderer/src/components/CaptionLog.vue | 21 ++++-- src/renderer/src/components/EngineStatus.vue | 68 ++++++++++++++++++-- src/renderer/src/i18n/lang/en.ts | 21 ++++-- src/renderer/src/i18n/lang/ja.ts | 19 ++++-- src/renderer/src/i18n/lang/zh.ts | 21 ++++-- src/renderer/src/types/index.ts | 8 +++ 12 files changed, 179 insertions(+), 34 deletions(-) diff --git a/docs/TODO.md b/docs/TODO.md index 9fcc06a..ce8876c 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -14,10 +14,11 @@ - [x] 字幕窗口右上角图标改为竖向排布 *2025/07/14* - [x] 可以调整字幕时间轴 *2025/07/14* - [x] 可以导出 srt 格式的字幕记录 *2025/07/14* +- [x] 可以获取字幕引擎的系统资源消耗情况 *2025/07/15* ## 待完成 -- [ ] 可以获取字幕引擎的系统资源消耗情况 +- [ ] 探索更多的语音转文字模型 ## 后续计划 diff --git a/docs/api-docs/electron-ipc.md b/docs/api-docs/electron-ipc.md index 2dbc3e9..7678f0b 100644 --- a/docs/api-docs/electron-ipc.md +++ b/docs/api-docs/electron-ipc.md @@ -57,6 +57,19 @@ - 发送:无数据 - 接收:`string` +### `control.engine.info` + +**介绍:** 获取字幕引擎的资源消耗情况 + +**发起方:** 前端控制窗口 + +**接收方:** 后端控制窗口实例 + +**数据类型:** + +- 发送:无数据 +- 接收:`EngineInfo` + ## 前端 ==> 后端 ### `control.uiLanguage.change` diff --git a/package-lock.json b/package-lock.json index 574e1ca..8f9dfea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/utils": "^4.0.0", "ant-design-vue": "^4.2.6", + "pidusage": "^4.0.1", "pinia": "^3.0.2", "vue-i18n": "^11.1.9", "vue-router": "^4.5.1" @@ -7742,6 +7743,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidusage": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-4.0.1.tgz", + "integrity": "sha512-yCH2dtLHfEBnzlHUJymR/Z1nN2ePG3m392Mv8TFlTP1B0xkpMQNHAnfkY0n2tAi6ceKO6YWhxYfZ96V4vVkh/g==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/pinia": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.2.tgz", @@ -8292,7 +8305,6 @@ "version": "5.2.1", "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", diff --git a/package.json b/package.json index 0ce4bd7..8190e42 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/utils": "^4.0.0", "ant-design-vue": "^4.2.6", + "pidusage": "^4.0.1", "pinia": "^3.0.2", "vue-i18n": "^11.1.9", "vue-router": "^4.5.1" diff --git a/src/main/ControlWindow.ts b/src/main/ControlWindow.ts index 0e73586..10ad2ca 100644 --- a/src/main/ControlWindow.ts +++ b/src/main/ControlWindow.ts @@ -1,5 +1,7 @@ import { shell, BrowserWindow, ipcMain, nativeTheme, dialog } from 'electron' import path from 'path' +import { EngineInfo } from './types' +import pidusage from 'pidusage' import { is } from '@electron-toolkit/utils' import icon from '../../build/icon.png?asset' import { captionWindow } from './CaptionWindow' @@ -81,6 +83,20 @@ class ControlWindow { return result.filePaths[0]; }) + ipcMain.handle('control.engine.info', async () => { + const info: EngineInfo = { + pid: 0, ppid: 0, cpu: 0, mem: 0, elapsed: 0 + } + if(captionEngine.processStatus !== 'running') return info + const stats = await pidusage(captionEngine.process.pid) + info.pid = stats.pid + info.ppid = stats.ppid + info.cpu = stats.cpu + info.mem = stats.memory + info.elapsed = stats.elapsed + return info + }) + ipcMain.on('control.uiLanguage.change', (_, args) => { allConfig.uiLanguage = args if(captionWindow.window){ diff --git a/src/main/types/index.ts b/src/main/types/index.ts index 59ca5a4..eb4ed5b 100644 --- a/src/main/types/index.ts +++ b/src/main/types/index.ts @@ -54,3 +54,11 @@ export interface FullConfig { controls: Controls, captionLog: CaptionItem[] } + +export interface EngineInfo { + pid: number, + ppid: number, + cpu: number, + mem: number, + elapsed: number +} \ No newline at end of file diff --git a/src/renderer/src/components/CaptionLog.vue b/src/renderer/src/components/CaptionLog.vue index c435fd7..b8ab316 100644 --- a/src/renderer/src/components/CaptionLog.vue +++ b/src/renderer/src/components/CaptionLog.vue @@ -59,6 +59,14 @@ .json +
+ {{ $t('log.exportContent') }} + + {{ $t('log.both') }} + {{ $t('log.source') }} + {{ $t('log.translation') }} + +
{{ $t('log.copyContent') }} - + {{ $t('log.both') }} {{ $t('log.source') }} {{ $t('log.translation') }} @@ -86,7 +94,6 @@ {{ $t('log.copy') }} (0) const baseMM = ref(0) @@ -228,7 +235,9 @@ function getExportData() { const item = captionData.value[i] content += `${i+1}\n` content += `${item.time_s} --> ${item.time_t}\n`.replace(/\./g, ',') - content += `${item.text}\n${item.translation}\n\n` + if(contentOption.value === 'both') content += `${item.text}\n${item.translation}\n\n` + else if(contentOption.value === 'source') content += `${item.text}\n\n` + else content += `${item.translation}\n\n` } return content } @@ -239,8 +248,8 @@ function copyCaptions() { const item = captionData.value[i] if(showIndex.value) content += `${i+1}\n` if(copyTime.value) content += `${item.time_s} --> ${item.time_t}\n`.replace(/\./g, ',') - if(copyOption.value === 'both') content += `${item.text}\n${item.translation}\n\n` - else if(copyOption.value === 'source') content += `${item.text}\n\n` + if(contentOption.value === 'both') content += `${item.text}\n${item.translation}\n\n` + else if(contentOption.value === 'source') content += `${item.text}\n\n` else content += `${item.translation}\n\n` } navigator.clipboard.writeText(content) diff --git a/src/renderer/src/components/EngineStatus.vue b/src/renderer/src/components/EngineStatus.vue index fbe31ff..aadb401 100644 --- a/src/renderer/src/components/EngineStatus.vue +++ b/src/renderer/src/components/EngineStatus.vue @@ -7,12 +7,38 @@ :value="(customized && customizedApp)?$t('status.customized'):engine" /> - - - + + + + + + @@ -88,6 +114,7 @@