【開發雜談】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
英文地址,請注明出處:http://en.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 創造一個簡…