【开发杂谈】Auto Caption:使用 Electron 和 Python 开发实时字幕显示软件

项目已开源到 GitHub,项目地址:HiMeditator/auto-captionhttps://github.com/HiMeditator/auto-caption

软件下载(Windows平台):Releases · HiMeditator/auto-captionhttps://github.com/HiMeditator/auto-caption/releases


你是否遇到过看外语视频却没有字幕的情况,或者环境嘈杂需要实时字幕来获取信息。这时候一个能实时将系统音频转换为字幕和翻译并显示的软件就能派上用场了。下面就介绍一下我最近开发的一个实时字幕软件。

项目简介

软件主界面

Auto Caption 是一个跨平台的字幕显示软件,能够实时获取系统音频输入(录音)或输出(播放声音)的流式数据,并调用音频转文字的模型生成对应音频的字幕。软件提供的默认字幕引擎(使用阿里云 Gummy 模型)支持九种语言(中英日韩德法俄西意)的识别与翻译。目前软件提供的自带字幕引擎使用了阿里云的模型服务,所以要使用该字幕引擎需要获取阿里云的 API KEY。

目前软件默认字幕引擎只有在 Windows 平台下才拥有完整功能。在 Linux 平台下只能生成音频输入(麦克风)的字幕,还不支持音频输出(播放声音)的字幕生成。

我还为项目制作了一个视频,想了解项目的同学可以去看看:

开源字幕软件Auto Caption:项目介绍与展示,捕捉音频秒变文字,打造你的专属字幕系统https://www.bilibili.com/video/BV1DCKiznENJ

整个项目可以分为四个部分:前端、后端、客户端集成和字幕引擎。

项目技术架构

前端开发

通过 Electron 框架,可以使用 Web 前端开发的技术栈来开发桌面软件。我使用 Vue3 来开发该软件的用户界面,这部分开发和 Web 前端开发差不多,唯一不同的就是用 IPC 和后端通信。这部分 Electron 提供了很好的封装,直接调方法就可以了。

前端的主要功能就是提供字幕引擎和字幕样式的管理界面、提供字幕记录的展示,以及提供另一个实时字幕显示的窗口。

实时字幕显示的窗口

另一个问题就是该软件需要两个不同的窗口,那前端是否要为两个窗口分别写各种的前端项目呢?我使用路由(Vue Router)来载入不同的窗口,这样就只需要一个前端项目就可以表示两个窗口。需要注意的是,打开的两个窗口处于不同的运行环境,因此它们的数据是不互通的,需要通过后端来交换数据。

后端开发

后端使用 Node.js 开发,主要用于管理字幕引擎和字幕样式的设置以及字幕记录。要实现系统音频的实时获取和字幕生成,使用 Node.js 会非常难实现,所以我把那部分剥离了出去,使用其他技术进行单独开发,那部分也被称为字幕引擎。因此后端还需要实现字幕引擎的调用,我使用的是 child_process 模块下的 spawn 方法来调用字幕引擎。 

客户端集成

项目使用 Electron 框架开发。Electron 是一个用于构建跨平台桌面应用程序的开源框架。它结合了 Chromium 渲染引擎和 Node.js 运行时环境,允许开发者使用前端技术 + Node.js 来创建原生的应用程序。而且通过Electron,可以一次性编写代码,然后在多个操作系统上运行,包括Windows、macOS和Linux。

选择 Electron 开发的原因主要就是对我来说学习成本较小,因为我之前主要在做前端开发和 VS Code 插件开发,对前端和 Node.js 都有了解,学习使用 Electron 开发桌面软件就能很快入门。Electron 开发的缺点是每个应用都得打包自己的 Chromium 和 Node.js 副本,因此开发的桌面软件占用空间较大,不太适合开发小工具。

项目开发使用了 Electron Vite 作为构建工具,通过 Electron Vite 可以快速生成初始项目模板,主进程和渲染进行的通信接口也进行了很好的封装。Electron Vite 提供的便捷可以让我更专注于项目的开发而不是环境的配置。

字幕引擎开发

所谓的字幕引擎实际上是一个子程序,它会实时获取系统音频输入(录音)或输出(播放声音)的流式数据,并调用音频转文字的模型生成对应音频的字幕。生成的字幕转换为 JSON 格式的字符串数据,并通过 IPC 传递给主程序。主程序读取字幕引擎的数据,处理后显示在窗口上。

字幕引擎的设计是模块化的,因此如果了解了字幕引擎的工作原理和数据传递规范,其他开发者也可以开发自定义的字幕引擎。字幕引擎部分我写了一个文档介绍其工作原理和数据规范,感兴趣的开发者可以去看看,在项目 GitHub 仓库的 assets 文件夹下。

自定义字幕引擎示例

下面说说我自己开发的字幕引擎。要开发字幕引擎,首先就是系统音频数据流的获取。要获取麦克风的输入音频比较容易,很多语言都有对应的库。但是要获取系统音频的输出流就比较麻烦了,这部分我查了很多资料,没有找到合适的跨平台解决方案。

最后我找到了一个适合 Windows 的 Python 库 PyAudioWPatch,这个库允许使用 WASAPI 设备作为环回使用 PyAudio。PyAudio 是 Python 中一个跨平台的音频库,可以获取系统录音。而 PyAudio 使得在 Windows 平台获取系统音频输出也成为了可能。在 Linux 平台我还没有找到类似的库,加上我现在配置的 Linux 虚拟机在开发字幕引擎时遇到了问题,因此该项目的字幕引擎在 Linux 上功能还不完整。

跨平台的 Python 音频库:PyAudio

获取到系统音频流后还可能需要对系统音频流进行处理。我使用的阿里云 Gummy 模型只能识别单通道的音频流,但我获取的是双通道的音频流。因此刚开始模型输出的全是和原文不相关毫无逻辑的内容,后面摸索了很久我才发现问题。我使用了 NumPy 库来进行音频流的通道数转换。代码如下:

def mergeStreamChannels(data, channels):"""将当前多通道流数据合并为单通道流数据Args:data: 多通道数据channels: 通道数Returns:mono_data_bytes: 单通道数据"""# (length * channels,)data_np = np.frombuffer(data, dtype=np.int16)# (length, channels)data_np_r = data_np.reshape(-1, channels)# (length,)mono_data = np.mean(data_np_r.astype(np.float32), axis=1)mono_data = mono_data.astype(np.int16)mono_data_bytes = mono_data.tobytes()return mono_data_bytes

另一个问题是每次读取的数据块的大小。所谓的音频流事实上是一个个被切分成的音频数据块。切分的音频块不宜过大或过小,经过我的尝试,我编写的字幕引擎将音频块切分为 50ms 每块,识别效果比较好。

得到了处理好的音频流后就是模型调用了,这部分参考使用的模型的接口文档即可。在编写完整的字幕引擎前可以先在 Jupyter Notebook 中编写一个简单的原型,确保方案可行。最后将模型返回的字幕和翻译结果按接口规范,包装为 JSON 格式的字符串,通过 IPC 传递给调用程序。

开发的 Python 程序通过命令行参数获取字幕配置,在我的程序有三个命令行参数,分别表示:源语言、翻译语言、音频类型(如下图)。开发完成后,使用 PyInstaller 将该 Python 程序打包为可执行文件,确保在不同用户电脑上都可直接运行,这样一个字幕引擎就做好了。

我开发的字幕引擎,具有三个命令行参数

后续计划

这个项目目前初步具有了实用价值,但是还有很大的改进空间。目前的改进计划如下:

  1. 添加更多自带字幕引擎。目前的字幕引擎只有 Gummy,而要使用该引擎需要申请阿里云百炼平台的API KEY,对于普通用户来说比较麻烦。之后考虑添加更多方便使用的字幕引擎,尤其是可以直接本地部署的模型。
  2. 添加多语言支持。目前软件只支持中文,可以考虑添加英语和日语支持。
  3. 添加暗色主题,对于习惯使用暗色主题的用户友好。
  4. 优化页面样式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88729.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

临床项目范围管理:确保项目聚焦与成功交付

一、核心目标 1.1 清晰定义项目边界 1.1.1 明确项目目标 明确项目具体目标、可交付成果、研究活动、纳入/排除标准、数据收集范围等,为项目规划、执行、监控和控制奠定基础。 1.1.2 防止范围蔓延 严格控制未经批准的变更,避免项目目标、活动或可交付成果超出最初约定,导致…

opi是什么

是的,当然可以!您提出了一个非常好的问题。 opi 远不止是一个 NVIDIA 驱动安装器,它是一个非常强大的、专为 openSUSE 设计的**“超级安装助手”**或“智能搜索工具”。 它的主要目的就是为了解决一个常见问题:“我想安装一个软…

【Go语言-Day 9】指针基础:深入理解内存地址与值传递

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

如何使用 vue vxe-table 来实现一个产品对比表表格

如何使用 vue vxe-table 来实现一个产品对比表表格 查看官网&#xff1a;https://vxetable.cn 效果 代码 <template><div class"demo-page-wrapper"><vxe-grid v-bind"gridOptions"><template #img11><vxe-image src"h…

【CF】Day85——CF 1033 (Div. 2) B (物理?) + CF 860 (Div. 2) C (数学思维 + lcm + gcd)

忙于期末&#xff0c;久久未写&#xff0c;今日一写&#xff0c;全都忘了 C. Candy Store 题目&#xff1a; 思路&#xff1a; 数学思维 我们假设一个标签 cost 可以覆盖一个连续的区间&#xff0c;那么这个 cost 就满足 cost bl * dl bl1 * dl1 ... br-1 * dr-1 br * d…

16.2 Docker多阶段构建实战:LanguageMentor镜像瘦身40%,支持500+并发1.2秒响应!

LanguageMentor Agent 容器化部署与发布:Docker 镜像创建与测试 关键词:Docker 容器化部署, 多阶段构建, 镜像分层优化, 环境一致性, 私有化模型集成 1. Dockerfile 最佳实践架构设计 通过多阶段构建策略实现开发与生产环境分离: #mermaid-svg-CKUsKERUN6nqM0bI {font-fam…

高可用与低成本兼得:全面解析 TDengine 时序数据库双活与双副本

在现代数据管理中&#xff0c;企业对于可靠性、可用性和成本的平衡有着多样化的需求。为此&#xff0c;TDengine 在 3.3.0.0 版本中推出了两种不同的企业级解决方案&#xff1a;双活方案和基于仲裁者的双副本方案&#xff0c;以满足不同应用场景下的特殊需求。本文将详细探讨这…

Github项目:Python编写的录屏工具 TTvideo(已打包)

打包好能立即用的github项目&#xff1a;TTvideo 用的github上的项目&#xff1a;https://github.com/jumppppp/ttvideo 朴实无华&#xff0c;功能强大的录屏工具 原作者如有认为侵权&#xff0c;评论区联系立删 1.效果图 2.下载链接 录屏工具

LE AUDIO---Chapter 2. The Bluetooth® LE Audio architecture

目录 2.1 The use cases 2.1.1 Hearing aid requirements - the use cases 2.1.1.1 Basic telephony 2.1.1.2 Low latency audio from a TV 2.1.1.3 Adding more users 2.1.1.4 Adding more listeners to support larger areas 2.1.1.5 Coordinating left and right hearin…

算法第54天| 并查集

107. 寻找存在的路径 题目 思路与解法 #include <iostream> #include <vector> using namespace std;int n; // 节点数量 vector<int> father vector<int> (101, 0); // 按照节点大小定义数组大小// 并查集初始化 void init() {for (int i 1; i &l…

守护API可用性:全面对抗DDoS与CC洪水攻击策略

API的可用性直接关系到用户体验和业务收入。分布式拒绝服务&#xff08;DDoS&#xff09;和针对应用层的CC&#xff08;Challenge Collapsar&#xff09;攻击&#xff0c;旨在耗尽服务器资源&#xff08;带宽、连接数、CPU&#xff09;&#xff0c;使合法用户无法访问。这类攻击…

第 4 章:第一个神经网络实战——使用 PyTorch

第 4 章&#xff1a;第一个神经网络实战——使用 PyTorch 经过前三章的学习&#xff0c;我们已经对神经网络的理论基础有了扎实的理解。我们知道数据如何前向传播&#xff0c;如何用损失函数评估预测&#xff0c;以及如何通过梯度下降和反向传播来更新网络参数。 理论是根基&a…

MST56XXB/MST5650B/MST5033B 是一款耐高压的LDO芯片,针对中控设备,给MCU供电,60V的耐压,150mA

MST56XXB系列是一款高输入电压(60V)低静态电流、高PSRR线性稳压器(LDO)&#xff0c;能够提供150mA负载电流。LDO针对线电压瞬变和负载电流瞬变具有非常快速的响应特性&#xff0c;并确保LDO启动期间和短路恢复过程中不会出现过冲电压。该设备具有集成的短路和热关断保护。该设备…

Java基础(五):流程控制全解析——分支(if/switch)和循环(for/while)的深度指南

Java基础系列文章 Java基础(一)&#xff1a;发展史、技术体系与JDK环境配置详解 Java基础(二)&#xff1a;八种基本数据类型详解 Java基础(三)&#xff1a;逻辑运算符详解 Java基础(四)&#xff1a;位运算符详解 Java基础(五)&#xff1a;if/switch与for/while - 深入理解…

面向对象概述

1 面向过程程序设计 面向过程是最为实际的一种思考方式&#xff0c;面向对象的方法也是含有面向过程的思想&#xff0c;面向过程是一种基础的方法。它考虑的是实际的实现&#xff0c;一般的面向过程是从上往下步步求精。面向过程最重要的是模块化的思想方法。对比面向对象&…

linux dts overlay

设备树 Overlay&#xff08;Device Tree Overlays, DTO&#xff09;&#xff0c;它在嵌入式Linux系统&#xff08;尤其是基于ARM的设备&#xff0c;比如树莓派、NanoPi等&#xff09;中非常常见。它主要用于动态修改设备树&#xff0c;以适配硬件的变化或扩展外设支持。 1. 设备…

ArkUI-X的声明式语法转换过程

以下是ArkUI-X声明式语法转换过程的详细解析&#xff0c;结合其核心设计原理与实现机制&#xff1a; ‌一、基础语法转换规则 组件声明转换 传统命令式组件创建&#xff08;如Android XMLJava&#xff09;转换为ArkUI-X的Component结构&#xff1a; // 命令式&#xff08;A…

Docker 入门教程(一):从概念到第一个容器

文章目录 &#x1f433; Docker 入门教程&#xff08;一&#xff09;&#xff1a;从概念到第一个容器1. Docker 是什么&#xff1f;2. Docker 的核心概念3. 安装 Docker4. 运行你的第一个 Docker 容器 &#x1f433; Docker 入门教程&#xff08;一&#xff09;&#xff1a;从概…

如何在 Vue 应用中嵌入 ONLYOFFICE 编辑器

以下是仅包含 纯前端集成 ONLYOFFICE 文档编辑器到 Vue.js 项目 的完整代码与说明&#xff0c;无需重新创建项目&#xff0c;可直接集成到现有 Vue 项目中&#xff1a; Vue.js 集成 ONLYOFFICE 文档编辑器&#xff08;纯前端实现&#xff09; 后端需要部署到服务器&#xff0c…

Cursor 1.0 炸裂功能:在后台运行多个Agent,释放双手

Cursor 1.0 版本更新了用于代码审查的 BugBot、对内存、一键式 MCP 设置、Jupyter 支持以及 Background Agent 的正式发布。 今天这篇文章主要介绍 Background Agent 的使用教程。 文章目录 1. Background Agent 的基本概念2. 后台 Agent 的使用方法3. 让后台 Agent 创造一个简…