基于 Blazor 打造一款实时字幕
早先在錄制視頻的時候一直使用的是 obs-auto-subtitle 作為實時字幕展示功能。不過這個是以 OBS 插件的形式存在,不管是語言和功能上都有一定的限制。故而使用 Blazor server 實現(xiàn)一個。
總體思路
實時字幕自然需要語音轉(zhuǎn)文字的功能。考察了一些服務(wù)之后,發(fā)現(xiàn)同時具備有一定免費(fèi)額度和有 C# SDK 兩個條件的,就只有 Azure Cognitive Service 了。故而選擇了它。
使用 Blazor server 從服務(wù)端實時刷新頁面到前端是非常簡單的事情。因此,渲染一個簡單的列表文本,然后通過 OBS 的 browser 組件接入畫面即可。
快樂編碼
有了基本的思路,我們就可以開始快樂的編碼了。
簡要設(shè)計
一般來說,語音轉(zhuǎn)文字服務(wù)是一個與服務(wù)端進(jìn)行持續(xù)交互的過程。因此需要一個對象來保持和服務(wù)端之間的溝通。我們可以設(shè)計一個ILiveCaptioningProvider來表示這種行為:
using?System; using?System.Threading.Tasks;namespace?Newbe.LiveCaptioning.Services {public?interface?ILiveCaptioningProvider?:?IAsyncDisposable{Task?StartAsync();void?AddCallBack(Func<CaptionItem,?Task>?captionCallBack);} }為了擴(kuò)展可能適配不同提供商的可能,我們同樣設(shè)計一個ILiveCaptioningProviderFactory用于表現(xiàn)創(chuàng)建ILiveCaptioningProvider的行為:
namespace?Newbe.LiveCaptioning.Services {public?interface?ILiveCaptioningProviderFactory{ILiveCaptioningProvider?Create();} }有了這樣兩個接口,在頁面上只要通過ILiveCaptioningProviderFactory創(chuàng)建ILiveCaptioningProvider,然后不斷的接收回調(diào)展示在頁面上即可。
將內(nèi)容展示在頁面上
有了基本的項目結(jié)構(gòu)和接口,便可以嘗試將內(nèi)容綁定到頁面上。要將實時轉(zhuǎn)換的內(nèi)容展示到界面上需要進(jìn)行一定的算法轉(zhuǎn)換。
在此之前,我們需要確定一下頁面展示的預(yù)期:
在頁面上展示至少兩行文本
當(dāng)一句話超過一行文本的寬度時自動進(jìn)行換行
當(dāng)一句話結(jié)束時,下一句話自動換行
例如,上面這句話進(jìn)行連續(xù)閱讀時,可能會出現(xiàn)如下效果:
https://www.newbe.pro/images/20210724-001.gif
live caption display主要需要注意的是,在判斷是要更新當(dāng)前行還是進(jìn)行換行,這部分邏輯需要注意進(jìn)行處理。
填充實現(xiàn)
通過 Azure SDK 提供的SpeechRecognizer對象來進(jìn)行語音識別
通過 Subject 將事件轉(zhuǎn)換為一個簡單的可觀測流,簡化業(yè)務(wù)回調(diào)的處理
實現(xiàn)工廠的方式非常多,這里采用 Autofac 來協(xié)助完成對象的創(chuàng)建
對頁面邏輯進(jìn)行填充,完成效果
通過以上核心的代碼,就可以完成從識別到展示相關(guān)的內(nèi)容。
下載與安裝
在嘗試進(jìn)行源碼了解之前,你可以通過以下步驟來初步體驗一下項目的效果。
首先,你可以從 Release 頁面下載和你操作系統(tǒng)對應(yīng)的版本:
https://github.com/newbe36524/Newbe.LiveCaptioning/releases
release然后,將這個軟件包解壓到預(yù)先創(chuàng)建好的文件夾。
unzip接著,在 Azure Portal 中創(chuàng)建一個 Cognitive Services。
提示 1:語音轉(zhuǎn)文字每個月有 5 個小時的免費(fèi)額度,可以參見
https://azure.microsoft.com/pricing/details/cognitive-services/speech-services/?WT.mc_id=DX-MVP-5003606
提示 2:你可以通過這個幫助來創(chuàng)建一個免費(fèi)的 Azure 賬號,新賬號包含有 12 個月的免費(fèi)大禮包,參見
https://docs.microsoft.com/en-us/dynamics-nav/how-to--sign-up-for-a-microsoft-azure-subscription?WT.mc_id=DX-MVP-5003606
create serviceregion and key隨后,將生成好的 region 和 key 填入到 appsettings.Production.json 中。
記得同時修改 Language 選項,例如美式英語為 en-us,簡體中文為 zh-cn。你可以通過以下鏈接來查看所有支持的語言:
https://docs.microsoft.com/azure/cognitive-services/speech-service/language-support?WT.mc_id=DX-MVP-5003606
update appsettings.Production.json繼而,啟動 Newbe.LiveCaptioning.exe,你可以看到如下這樣的提示信息,就說明一切已經(jīng)正常。
region and key最后,你可以使用瀏覽器打開http://localhost:5000,并對著你的話筒說話,這樣便可以實時產(chǎn)生字幕了。
live caption在 OBS 中加入字幕
首先,打開你的 OBS,并添加一個 browser 組件。
add browser在組件的 url 中填入 http://localhost:5000,并設(shè)置一個合適的寬度和高度。
add browser對著你的話筒話說,字幕就出來了。
https://www.newbe.pro/images/20210725-010.gif
test輔助資料
Azure Speech to Text
可以通過以下鏈接在初步體驗一下識別的效果:
https://azure.microsoft.com/services/cognitive-services/speech-to-text/?WT.mc_id=DX-MVP-5003606#overview
可以通過以下鏈接找到 C# SDK 的對接方案:
https://docs.microsoft.com/azure/cognitive-services/speech-service/get-started-speech-to-text?WT.mc_id=DX-MVP-5003606
Blazor server
可以通過以下鏈接來了解,如何通過服務(wù)端來推送 UI 變化到前端:
https://swimburger.net/blog/dotnet/pushing-ui-changes-from-blazor-server-to-browser-on-server-raised-events
可以通過以下鏈接來了解,如何在 UI 線程之外來出發(fā) UI 變化(這不就是 winform 再現(xiàn)):
https://docs.microsoft.com/aspnet/core/blazor/components/rendering?view=aspnetcore-5.0&WT.mc_id=DX-MVP-5003606#receiving-a-call-from-something-external-to-the-blazor-rendering-and-event-handling-system
.Net core publish
通過這里了解如何將 dotnet core 程序發(fā)布為一個單文件應(yīng)用
https://docs.microsoft.com/dotnet/core/deploying/single-file?WT.mc_id=DX-MVP-5003606
了解不同操作系統(tǒng)下發(fā)布使用的 RID
https://docs.microsoft.com/dotnet/core/rid-catalog?WT.mc_id=DX-MVP-5003606
Github
了解如何通過 github action 打包發(fā)布內(nèi)容到 release 中:
https://github.com/gittools/gitreleasemanager
小結(jié)
這是一個非常簡單的項目應(yīng)用,開發(fā)者可以通過該項目初步的了解 Blazor 的使用方法。你可以通過以下地址來獲取本項目的源代碼:
https://github.com/newbe36524/Newbe.LiveCaptioning
總結(jié)
以上是生活随笔為你收集整理的基于 Blazor 打造一款实时字幕的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ant Design Blazor 发布
- 下一篇: 杀鸡焉用牛刀!放下Windbg,让dot