release v0.2.0
- 更新和增加文档 - 添加新的图片 - 优化文档结构和内容
@@ -1,87 +0,0 @@
|
||||
# 字幕引擎说明文档
|
||||
|
||||

|
||||
|
||||
## 字幕引擎介绍
|
||||
|
||||
所谓的字幕引擎实际上是一个子程序,它会实时获取系统音频输入(录音)或输出(播放声音)的流式数据,并调用音频转文字的模型生成对应音频的字幕。生成的字幕转换为 JSON 格式的字符串数据,并通过 IPC 传递给主程序。主程序读取字幕数据,处理后显示在窗口上。
|
||||
|
||||
## 字幕引擎需要实现的功能
|
||||
|
||||
### 音频获取
|
||||
|
||||
首先,你的字幕引擎需要获取系统音频输入(录音)或输出(播放声音)的流式数据。如果使用 Python 开发,可以使用 PyAudio 库获取麦克风音频输入数据(全平台通用)。使用 PyAudioWPatch 库获取系统音频输出(仅适用于 Windows 平台)。
|
||||
|
||||
一般获取的音频流数据实际上是一个一个的时间比较短的音频块,需要根据模型调整音频块的大小。比如阿里云的 Gummy 模型使用 0.05 秒大小的音频块识别效果优于使用 0.2 秒大小的音频块。
|
||||
|
||||
### 音频处理
|
||||
|
||||
获取到的音频流在转文字之前可能需要进行预处理。比如阿里云的 Gummy 模型只能识别单通道的音频流,而收集的音频流一般是双通道的,因此要将双通道音频流转换为单通道。通道数的转换可以使用 NumPy 库中的方法实现。
|
||||
|
||||
### 音频转文字
|
||||
|
||||
在得到了合适的音频流后,就可以将音频流转换为文字了。一般使用各种模型来实现音频流转文字。可根据需求自行选择模型。
|
||||
|
||||
### 数据传递
|
||||
|
||||
在获取到当前音频流的文字后,需要将文字传递给主程序。使用进程间通信(IPC)的方式,比如通过标准输入输出流或者命名管道来实现。传递的内容必须是 JSON 字符串,其中 JSON 对象需要包含的参数如下:
|
||||
|
||||
```typescript
|
||||
export interface CaptionItem {
|
||||
index: number, // 字幕序号
|
||||
time_s: string, // 当前字幕开始时间
|
||||
time_t: string, // 当前字幕结束时间
|
||||
text: string, // 字幕内容
|
||||
translation: string // 字幕翻译
|
||||
}
|
||||
```
|
||||
|
||||
如果使用 python 语言,可以参考以下方式将数据传递给主程序:
|
||||
|
||||
```python
|
||||
# caption-engine\audio2text\gummy.py
|
||||
...
|
||||
def send_to_node(self, data):
|
||||
"""
|
||||
将数据发送到 Node.js 进程
|
||||
"""
|
||||
try:
|
||||
json_data = json.dumps(data) + '\n'
|
||||
sys.stdout.write(json_data)
|
||||
sys.stdout.flush()
|
||||
except Exception as e:
|
||||
print(f"Error sending data to Node.js: {e}", file=sys.stderr)
|
||||
...
|
||||
```
|
||||
|
||||
数据接收端代码如下:
|
||||
|
||||
|
||||
```typescript
|
||||
// src\main\utils\engine.ts
|
||||
...
|
||||
this.process.stdout.on('data', (data) => {
|
||||
const lines = data.toString().split('\n');
|
||||
lines.forEach((line: string) => {
|
||||
if (line.trim()) {
|
||||
try {
|
||||
const caption = JSON.parse(line);
|
||||
addCaptionLog(caption);
|
||||
} catch (e) {
|
||||
controlWindow.sendErrorMessage('字幕引擎输出内容无法解析为 JSON 对象:' + e)
|
||||
console.error('[ERROR] Error parsing JSON:', e);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
this.process.stderr.on('data', (data) => {
|
||||
controlWindow.sendErrorMessage('字幕引擎错误:' + data)
|
||||
console.error(`[ERROR] Subprocess Error: ${data}`);
|
||||
});
|
||||
...
|
||||
```
|
||||
|
||||
## 参考代码
|
||||
|
||||
本项目 `caption-engine` 文件夹下的 `main-gummy.py` 文件为默认字幕引擎的入口代码。`src\main\utils\engine.ts` 为服务端获取字幕引擎数据和进行处理的代码。可以根据需要阅读了解字幕引擎的实现细节和完整运行过程。
|
||||
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 332 KiB |
BIN
assets/media/main_en.png
Normal file
|
After Width: | Height: | Size: 373 KiB |
BIN
assets/media/main_ja.png
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
assets/media/main_zh.png
Normal file
|
After Width: | Height: | Size: 384 KiB |
|
Before Width: | Height: | Size: 321 KiB |
BIN
assets/media/structure_en.png
Normal file
|
After Width: | Height: | Size: 321 KiB |
BIN
assets/media/structure_ja.png
Normal file
|
After Width: | Height: | Size: 324 KiB |
BIN
assets/media/structure_zh.png
Normal file
|
After Width: | Height: | Size: 323 KiB |
BIN
assets/structure.pptx
Normal file
@@ -1,289 +0,0 @@
|
||||
# api-doc
|
||||
|
||||
本文档主要记录主进程和渲染进程的通信约定。
|
||||
|
||||
## 命名方式
|
||||
|
||||
本项目渲染进程包含两个:字幕窗口和控制窗口,主进程需要分别和两者进行通信。通信命令的命名规则如下:
|
||||
|
||||
1. 命令一般由三个关键字组成,由点号隔开。
|
||||
2. 第一个关键字表示通信发送目标:
|
||||
- `config` 表示控制窗口类实例(后端)或控制窗口(前端)
|
||||
- `engine` 表示字幕窗口类实例(后端)或字幕窗口(前端)
|
||||
- `both` 表示上述对象都有可能成为目标
|
||||
3. 第二个关键字表示需要修改的对象 / 发生改变的对象,采用小驼峰命名
|
||||
4. 第三个关键字一般是动词,表示通信发生时对应动作 / 需要进行的操作
|
||||
|
||||
根据上面的描述可以看出通信命令一般有两种语义,一种表示要求执行的操作,另一种表示当前发生的事件。
|
||||
|
||||
## 前端 <=> 后端
|
||||
|
||||
### `both.window.mounted`
|
||||
|
||||
**介绍:**前端窗口挂载完毕,请求最新的配置数据
|
||||
|
||||
**发起方:**前端
|
||||
|
||||
**接收方:**后端
|
||||
|
||||
**数据类型:**
|
||||
|
||||
- 发送:无数据
|
||||
- 接收:`FullConfig`
|
||||
|
||||
### `control.nativeTheme.get`
|
||||
|
||||
**介绍:**前端获取系统当前的主题
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**
|
||||
|
||||
- 发送:无数据
|
||||
- 接收:`string`
|
||||
|
||||
## 前端 ==> 后端
|
||||
|
||||
### `control.uiLanguage.change`
|
||||
|
||||
**介绍:**前端修改字界面语言,将修改同步给后端
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**`UILanguage`
|
||||
|
||||
### `control.uiTheme.change`
|
||||
|
||||
**介绍:**前端修改字界面主题,将修改同步给后端
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**`UITheme`
|
||||
|
||||
### `control.leftBarWidth.change`
|
||||
|
||||
**介绍:**前端修改边栏宽度,将修改同步给后端
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**`number`
|
||||
|
||||
### `control.captionLog.clear`
|
||||
|
||||
**介绍:**清空字幕记录
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `control.styles.change`
|
||||
|
||||
**介绍:**前端修改字幕样式,将修改同步给后端
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**`Styles`
|
||||
|
||||
### `control.styles.reset`
|
||||
|
||||
**介绍:**将字幕样式恢复为默认
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `control.controls.change`
|
||||
|
||||
**介绍:**前端修改了字幕引擎配置,将最新配置发送给后端
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**`Controls`
|
||||
|
||||
### `control.captionWindow.activate`
|
||||
|
||||
**介绍:**激活字幕窗口
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `control.engine.start`
|
||||
|
||||
**介绍:**启动字幕引擎
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `control.engine.stop`
|
||||
|
||||
**介绍:**关闭字幕引擎
|
||||
|
||||
**发起方:**前端控制窗口
|
||||
|
||||
**接收方:**后端控制窗口实例
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `caption.windowHeight.change`
|
||||
|
||||
**介绍:**字幕窗口宽度发生改变
|
||||
|
||||
**发起方:**前端字幕窗口
|
||||
|
||||
**接收方:**后端字幕窗口实例
|
||||
|
||||
**数据类型:**`number`
|
||||
|
||||
### `caption.pin.set`
|
||||
|
||||
**介绍:**是否将窗口置顶
|
||||
|
||||
**发起方:**前端字幕窗口
|
||||
|
||||
**接收方:**后端字幕窗口实例
|
||||
|
||||
**数据类型:**`boolean`
|
||||
|
||||
### `caption.controlWindow.activate`
|
||||
|
||||
**介绍:**激活控制窗口
|
||||
|
||||
**发起方:**前端字幕窗口
|
||||
|
||||
**接收方:**后端字幕窗口实例
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `caption.window.close`
|
||||
|
||||
**介绍:**关闭字幕窗口
|
||||
|
||||
**发起方:**前端字幕窗口
|
||||
|
||||
**接收方:**后端字幕窗口实例
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
## 后端 ==> 前端
|
||||
|
||||
### `control.uiLanguage.set`
|
||||
|
||||
**介绍:**后端将最新界面语言发送给前端,前端进行设置
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**字幕窗口
|
||||
|
||||
**数据类型:**`UILanguage`
|
||||
|
||||
### `control.nativeTheme.change`
|
||||
|
||||
**介绍:**系统主题发生改变
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端控制窗口
|
||||
|
||||
**数据类型:**`string`
|
||||
|
||||
### `control.engine.started`
|
||||
|
||||
**介绍:**引擎启动成功
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端控制窗口
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `control.engine.stopped`
|
||||
|
||||
**介绍:**引擎关闭
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端控制窗口
|
||||
|
||||
**数据类型:**无数据
|
||||
|
||||
### `control.error.occurred`
|
||||
|
||||
**介绍:**发送错误
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端控制窗口
|
||||
|
||||
**数据类型:**`string`
|
||||
|
||||
### `control.controls.set`
|
||||
|
||||
**介绍:**后端将最新字幕引擎配置发送给前端,前端进行设置
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端控制窗口
|
||||
|
||||
**数据类型:**`Controls`
|
||||
|
||||
### `both.styles.set`
|
||||
|
||||
**介绍:**后端将最新字幕样式发送给前端,前端进行设置
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端
|
||||
|
||||
**数据类型:**`Styles`
|
||||
|
||||
### `both.captionLog.add`
|
||||
|
||||
**介绍:**添加一条新的字幕数据
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端
|
||||
|
||||
**数据类型:**`CaptionItem`
|
||||
|
||||
### `both.captionLog.upd`
|
||||
|
||||
**介绍:**更新最后一条字幕数据
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端
|
||||
|
||||
**数据类型:**`CaptionItem`
|
||||
|
||||
### `both.captionLog.set`
|
||||
|
||||
**介绍:**设置全部的字幕数据
|
||||
|
||||
**发起方:**后端
|
||||
|
||||
**接收方:**前端
|
||||
|
||||
**数据类型:**`CaptionItem[]`
|
||||
@@ -1,59 +0,0 @@
|
||||
# Auto Caption 用户手册
|
||||
|
||||
对应版本:v0.1.0
|
||||
|
||||
## 软件简介
|
||||
|
||||
Auto Caption 是一个跨平台的字幕显示软件,能够实时获取系统音频输入(录音)或输出(播放声音)的流式数据,并调用音频转文字的模型生成对应音频的字幕。软件提供的默认字幕引擎(使用阿里云 Gummy 模型)支持九种语言(中英日韩德法俄西意)的识别与翻译。
|
||||
|
||||
目前软件默认字幕引擎只有在 Windows 平台下才拥有完整功能。在 Linux 平台下只能生成音频输入(麦克风)的字幕,暂不支持音频输出(播放声音)的字幕生成。
|
||||
|
||||

|
||||
|
||||
### 软件缺点
|
||||
|
||||
要使用默认字幕服务需要获取阿里云的 API KEY。
|
||||
|
||||
软件使用 Electron 构建,因此软件体积不可避免的较大。
|
||||
|
||||
## 软件使用
|
||||
|
||||
### 准备阿里云百炼平台 API KEY
|
||||
|
||||
要使用软件提供的默认字幕引擎(阿里云 Gummy),需要从阿里云百炼平台获取 API KEY 并在本机环境变量中配置。
|
||||
|
||||
这部分阿里云提供了详细的教程,可参考:
|
||||
|
||||
- [获取 API KEY](https://help.aliyun.com/zh/model-studio/get-api-key)
|
||||
|
||||
- [将 API Key 配置到环境变量](https://help.aliyun.com/zh/model-studio/configure-api-key-through-environment-variables)。
|
||||
|
||||
### 修改字幕设置
|
||||
|
||||
字幕设置可以分为两类:修改字幕引擎配置、修改字幕样式设置。需要注意的是,在调整的设置的参数后,需要点击每个设置模块右上角的“更改设置”(字幕引擎设置)或“应用样式”(字幕样式设置),更改才会真正生效。如果点击“取消更改”那么当前设置将不会被保存,而是回到上次修改的状态。
|
||||
|
||||
### 启动和关闭字幕
|
||||
|
||||
在修改完全部配置后,点击界面的“启动字幕引擎”按钮,即可启动字幕。如果需要独立的字幕展示窗口,单击界面的“打开字幕窗口”按钮即可激活独立的字幕展示窗口。如果需要暂停字幕识别,单击界面的“关闭字幕引擎”按钮即可。
|
||||
|
||||
### 调整字幕展示窗口
|
||||
|
||||
如下图为字幕展示窗口,该窗口实时展示当前最新字幕。窗口右上角三个按钮的功能分别是:将窗口固定在最前面、打开字幕控制窗口、关闭字幕展示窗口。该窗口宽度可以调整,将鼠标移动至窗口的左右边缘,拖动鼠标即可调整宽度。
|
||||
|
||||

|
||||
|
||||
### 字幕记录的导出
|
||||
|
||||
在字幕控制窗口中可以看到当前收集的所有字幕的记录,点击“导出字幕记录”按钮,即可将字幕记录导出为 JSON 文件。
|
||||
|
||||
## 字幕引擎
|
||||
|
||||
所谓的字幕引擎实际上是一个子程序,它会实时获取系统音频输入(录音)或输出(播放声音)的流式数据,并调用音频转文字的模型生成对应音频的字幕。生成的字幕通过 IPC 输出为转换为字符串的 JSON 数据,并返回给主程序。主程序读取字幕数据,处理后显示在窗口上。
|
||||
|
||||
软件提供了一个默认的字幕引擎,如果你需要其他的字幕引擎,可以通过打开自定义引擎选项来调用其他字幕引擎(其他引擎需要针对进行开发)。其中引擎路径是自定义字幕引擎在你的电脑上的路径,引擎指令是自定义字幕引擎的运行参数,这部分需要按该字幕引擎的规则进行填写。
|
||||
|
||||

|
||||
|
||||
注意使用自定义字幕引擎时,前面的字幕引擎的设置将全部不起作用,自定义字幕引擎的配置完全通过引擎指令进行配置。
|
||||
|
||||
如果你是开发者,想开发自定义字幕引擎,请查看[字幕引擎说明文档](./engine-manual_zh.md)。
|
||||