主頁 >  其他 > 教你1分鐘搞定2小時字幕

教你1分鐘搞定2小時字幕

2023-05-26 08:53:40 其他

摘要:本文將介紹如何使用錄音檔案識別極速版給無字幕視頻自動生成字幕,

本文分享自華為云社區《利用錄音檔案極速版為視頻生成字幕》,作者:戈兀,

引言

越來越多的人們使用抖音、B站等視頻app,記錄、分享日常生活,隨之互聯網上產生了大量的長、短視頻,字幕是影響視頻觀看體驗的重要因素,以日常分享為主的視頻創作者往往沒有時間為視頻制作字幕,在創作者發音不清楚的前提下,沒有字幕的視頻可能會讓觀眾困惑甚至產生理解偏差,而帶字幕的視頻讓觀眾有更好的觀看體驗,“一氣呵成”順暢地看完,

語音識別技術(Automatic Speech Recognition)是一種將人的語音轉換為文本的技術,隨著深度學習的發展,端到端語音識別技術也取得了巨大的突破,將原始的音頻資料,經過分幀、加窗、FFT等操作后,得到描述音頻在時、頻域資訊的梅爾特征或是Fbank特征,將特征送入transformer等神經網路,輸出對應的文本資訊,此外,由大量文本訓練的語言模型(language model)能夠糾正語音識別輸出文本不通順的問題,改善閱讀體驗,而熱詞技術也被用來解決語音識別的領域適配問題,如同音不同字,

本文將介紹如何使用錄音檔案識別極速版給無字幕視頻自動生成字幕,

錄音檔案識別極速版采用同步介面,利用GPU加速模型的推理程序,對于兩個小時內的音、視頻檔案,可以在1分鐘內回傳識別結果,滿足準實時字幕、音頻質檢等對識別速度有要求的場景,感興趣的讀者可以點擊錄音檔案識別極速版檔案,了解詳情,
:本文同步發布至華為云AI Gallery Notebook,可以在AI Gallery上運行:利用錄音檔案極速版為視頻生成字幕

原理講解

給無字幕視頻生成字幕,就是從視頻中的提取音頻流,將音頻流送入錄音檔案識別極速版,得到識別文字,和對應的時間戳資訊,然后將其轉換為視頻字幕檔案格式,如srt檔案,得到srt字幕檔案后,在播放視頻時,載入字幕檔案,就可以看到字幕了,

因此,整個流程如下:

1、利用ffmpeg工具,從視頻中提取音頻流

2、設定適合的引數,使用錄音檔案識別極速版,催音頻檔案進行識別

3、對識別結果,包括文字和時間戳資訊,進行處理,得到視頻字幕檔案

4、將命名相同的視頻檔案與 srt 檔案放在同一目錄下,用播放器打開,即可得到有字幕的視頻,或者利用ffmpeg,以硬字幕的形式,將字幕嵌入到視頻中,

注:SRT(SubRip 檔案格式)是以 SubRip 檔案格式保存的簡單字幕檔案,擴展名為 .srt,每個字幕在 SRT 檔案中有四個部分:

  1. 指示字幕編號或位置的數字計數器;
  2. 字幕的開始和結束時間;
  3. 一行或多行的字幕文本;
  4. 表示字幕結束的空行,

代碼開發

步驟一:提取音頻流

采用ffmpeg從視頻檔案中提取音頻流,并保存為音頻檔案output.wav

ffmpeg -i input.mp4 -ar 16000 -ac 1 output.wav

-ar指定保存音頻檔案的采樣率,這里16000表示1秒鐘,保存16000個采樣點資料;-ac指定保存音頻的通道數,這里1表示保存為單通道音頻,

步驟二:安裝語音識別python SDK

在安裝python3后,用pip安裝其他依賴依賴包

pip install setuptools
pip install requests
pip install websocket-client

下載最新版python sdk原始碼:https://sis-sdk-repository.obs.cn-north-1.myhuaweicloud.com/python/huaweicloud-python-sdk-sis-1.8.1.zip
進入下載的Python SDK目錄,在setup.py所在層目錄執行 python setup.py install 命令,完成SDK安裝,

步驟三:呼叫錄音檔案極速版

  • 匯入依賴包
from huaweicloud_sis.client.flash_lasr_client import FlashLasrClient
from huaweicloud_sis.bean.flash_lasr_request import FlashLasrRequest
from huaweicloud_sis.exception.exceptions import ClientException
from huaweicloud_sis.exception.exceptions import ServerException
from huaweicloud_sis.bean.sis_config import SisConfig
import json
  • 初始化客戶端
config = SisConfig()
config.set_connect_timeout(50)
config.set_read_timeout(50)
client = FlashLasrClient(ak=ak, sk=sk, region=region, project_id=project_id, sis_config=config)
  • 構造請求
asr_request = FlashLasrRequest()
asr_request.set_obs_bucket_name(obs_bucket_name) # 設定存放音頻的桶名,必選
asr_request.set_obs_object_key(obs_object_key) # 設定OBS桶中的物件的鍵值,必選
asr_request.set_audio_format(audio_format) # 音頻格式,必選
asr_request.set_property(property) # property,比如:chinese_16k_conversation
asr_request.set_add_punc('yes')
asr_request.set_digit_norm('no')
asr_request.set_need_word_info('yes')
asr_request.set_first_channel_only('yes')

為視頻產生字幕檔案時,不僅需要文字,也需要文字對應的時間戳資訊,當一句話過長,螢屏無法完整顯示時,就需要對這句話進行切分,因此,僅僅根據每個句子的起始和截止時間,無法準確的確定切分后兩句話的起始和截止時間,因此我們需要字級別的時間資訊,而將need_word_info配置為‘yes’,就可以輸出字級別的時間戳資訊,如下:

"word_info": [
 {
 "start_time": 590,
 "word": "",
 "end_time": 630
 },
 {
 "start_time": 830,
 "word": "",
 "end_time": 870
 },
 {
 "start_time": 950,
 "word": "",
 "end_time": 990
 },
 {
 "start_time": 1110,
 "word": "",
 "end_time": 1150
 },
]
  • 接下里發送識別請求
result = client.get_flash_lasr_result(asr_request)
  • 拿到帶有詳細時間戳資訊的識別結果result:
"result": {
 "score": 0.9358551502227783,
 "word_info": [
 {
 "start_time": 590,
 "word": "",
 "end_time": 630
 },
 {
 "start_time": 830,
 "word": "",
 "end_time": 870
 },
 {
 "start_time": 950,
 "word": "",
 "end_time": 990
 },
 {
 "start_time": 1110,
 "word": "",
 "end_time": 1150
 },
 {
 "start_time": 1750,
 "word": "",
 "end_time": 1790
 },
 {
 "start_time": 1910,
 "word": "",
 "end_time": 1950
 },
 {
 "start_time": 2070,
 "word": "",
 "end_time": 2110
 },
 {
 "start_time": 2190,
 "word": "",
 "end_time": 2230
 },
 {
 "start_time": 2350,
 "word": "",
 "end_time": 2390
 },
 {
 "start_time": 2870,
 "word": "",
 "end_time": 2910
 },
 {
 "start_time": 3030,
 "word": "",
 "end_time": 3070
 },
 {
 "start_time": 3190,
 "word": "",
 "end_time": 3230
 },
 {
 "start_time": 3350,
 "word": "",
 "end_time": 3390
 },
 {
 "start_time": 3590,
 "word": "",
 "end_time": 3630
 },
 {
 "start_time": 3750,
 "word": "",
 "end_time": 3790
 },
 {
 "start_time": 3950,
 "word": "",
 "end_time": 3990
 },
 {
 "start_time": 4830,
 "word": "",
 "end_time": 4870
 },
 {
 "start_time": 4990,
 "word": "",
 "end_time": 5030
 },
 {
 "start_time": 5350,
 "word": "",
 "end_time": 5390
 },
 {
 "start_time": 5550,
 "word": "",
 "end_time": 5590
 },
 {
 "start_time": 5750,
 "word": "",
 "end_time": 5790
 },
 {
 "start_time": 5870,
 "word": "",
 "end_time": 5910
 },
 {
 "start_time": 6070,
 "word": "",
 "end_time": 6110
 },
 {
 "start_time": 6310,
 "word": "",
 "end_time": 6350
 },
 {
 "start_time": 6390,
 "word": "",
 "end_time": 6470
 },
 {
 "start_time": 6510,
 "word": "",
 "end_time": 6550
 },
 {
 "start_time": 6670,
 "word": "",
 "end_time": 6710
 },
 {
 "start_time": 6830,
 "word": "",
 "end_time": 6870
 },
 {
 "start_time": 7430,
 "word": "",
 "end_time": 7470
 },
 {
 "start_time": 7630,
 "word": "",
 "end_time": 7670
 },
 {
 "start_time": 7830,
 "word": "",
 "end_time": 7870
 },
 {
 "start_time": 8030,
 "word": "",
 "end_time": 8070
 },
 {
 "start_time": 8950,
 "word": "",
 "end_time": 8990
 },
 {
 "start_time": 9190,
 "word": "",
 "end_time": 9230
 },
 {
 "start_time": 9350,
 "word": "",
 "end_time": 9390
 },
 {
 "start_time": 9470,
 "word": "",
 "end_time": 9510
 }
 ],
 "text": "哎,大家好,我是你們的音樂老師康老師,那么這幾系列呢,我們來到了發聲練習三十五講,"
 },
 "start_time": 510,
 "end_time": 9640
}

步驟四:將識別結果轉為srt字幕格式檔案

由于視頻播放界面的寬度有限,當一句話包含的文字數過多時,會存在一行放不下的問題,因此我們在生成srt檔案時,需要將文字數量過長的一句話切分為兩句話,分別在不同的時間段顯示,企切分后的第一句話的起始時間不變,截止時間為最后一個字的截止時間;第二句話的起始時間為第一個字的起始時間,截止時間不變,這樣就保證切分后兩句話的時間戳也是正確的,進而在合適的視頻幀中顯示正確的文本內容,

def json2srt(json_result):
    results = ""
    count = 1
 max_word_in_line = 15
 min_word_in_line = 3
 punc = ["", "", "", ""]
    segments = json_result['flash_result'][0]['sentences']
 for i in range(len(segments)):
 current_result = segments[i]
 current_sentence = current_result["result"]["text"]
 if len(current_result["result"]["word_info"]) > max_word_in_line:
 srt_result = ""
 srt_result_len = 0
 current_segment = ""
 cnt = 0
            start = True
 for i in range(len(current_sentence)):
 if current_sentence[i] not in punc:
 if start:
 start_time = current_result["result"]["word_info"][cnt]['start_time']
                        start = False
 else:
 end_time = current_result["result"]["word_info"][cnt]['end_time']
 current_segment += current_sentence[i]
 srt_result_len += 1
 cnt += 1
 else:
 if srt_result_len < min_word_in_line:
 srt_result += current_segment + current_sentence[i]
 current_segment = ""
 else:
 srt_result += current_segment + current_sentence[i]
 current_segment = ""
 start_time = time_format(start_time)
 end_time = time_format(end_time)
 if srt_result[-1] == "":
 srt_result = srt_result[:-1]
                        results += str(count) + "\n" + start_time + "-->" + end_time + "\n" + srt_result + "\n" + "\n"
                        count += 1
                        start = True
 srt_result = ""
 else:
 start_time = time_format(current_result["start_time"])
 end_time = time_format(current_result["end_time"])
 if current_sentence[-1] == "":
 current_sentence = current_sentence[:-1]
            results += str(count) + "\n" + start_time + "-->" + end_time + "\n" + current_sentence + "\n" + "\n"
            count += 1
 return results

得到srt格式的字幕檔案

步驟五:播放視頻,載入字幕

修改檔案名,保證srt檔案和原始視頻檔案命名相同,然后用播放器播放視頻:

步驟六:使用ffmpeg給視頻添加硬字幕(可選)

ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output_srt.mp4

注: 硬字幕是將字幕渲染到視頻的紋理上,然后將其編碼成獨立于視頻格式的一個完整視頻,硬字幕與視頻是一個整體,不能更改或洗掉,

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553430.html

標籤:其他

上一篇:《中國電信天翼云PON SD-WAN技術白皮書》來了,這份技術指南不要錯過!

下一篇:返回列表

標籤雲
其他(159718) Python(38169) JavaScript(25452) Java(18129) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7211) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5341) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1976) 功能(1967) Web開發(1951) HtmlCss(1944) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 教你1分鐘搞定2小時字幕

    摘要:本文將介紹如何使用錄音檔案識別極速版給無字幕視頻自動生成字幕。 本文分享自華為云社區《利用錄音檔案極速版為視頻生成字幕》,作者:戈兀。 引言 越來越多的人們使用抖音、B站等視頻app,記錄、分享日常生活,隨之互聯網上產生了大量的長、短視頻。字幕是影響視頻觀看體驗的重要因素。以日常分享為主的視頻 ......

    uj5u.com 2023-05-26 08:53:40 more
  • 《中國電信天翼云PON SD-WAN技術白皮書》來了,這份技術指南不要錯

    5月17日,在中國電信第三屆科技節·上海站暨517世界電信榷訓動上,天翼云聯合中國電信上海公司正式發布《中國電信天翼云PON SD-WAN技術白皮書》,為中國電信深入實施“云轉數改”戰略,助力百萬政企客戶進行數字化轉型提供了技術理論支撐,更為業內突破云網關鍵核心技術,構建云網融合邊界接入生態體系提供... ......

    uj5u.com 2023-05-26 08:52:37 more
  • 構建高可用云原生應用,如何有效進行流量管理?

    摘要:對于那些希望使用華為云的云原生服務的人來說,這篇文章提供了很好的指導,讓他們了解如何通過容錯來保證他們的服務的可用性和穩定性。 本文分享自華為云社區《構建高可用云原生應用,如何有效進行流量管理?》,作者: breakDawn。 隨著云原生的概念越來越火,服務的架構應該如何發展和演進,成為很多程 ......

    uj5u.com 2023-05-26 08:52:23 more
  • Dummynet簡單部署

    本文分享自天翼云開發者社區《Dummynet簡單部署》,作者:凸凹

    部署流程

    ^準備內核版本

    ^參看系統內核版本

    uname -r

    我們需要將ipfw編譯成內核模塊,請確保ipfw用到的內核原始碼版本同你linux系統運行內核版本一致。 ......

    uj5u.com 2023-05-26 08:51:54 more
  • Excel表格和Unity

    # Excel表格和Unity ## 1.配置 下載EPPlus.dll 鏈接:https://pan.baidu.com/s/1l0FYTf8nATrPdEt6fXJ6Kg?pwd=1111 提取碼:1111 將dll檔案拖拽到**Assets/Plugins** **Assets**下新建檔案夾 ......

    uj5u.com 2023-05-26 08:46:24 more
  • 位運算在排序演算法中的運用

    ### 常規選擇排序 ```javascript function selectSort(arr: Number[]) { //先排除一些不需要排序的情況 if (!arr || arr.length 現有N個數,除了唯一的一個數出現的次數是奇數,其他的均是出現了偶數次的數,現在請編程找出這個出現奇 ......

    uj5u.com 2023-05-26 08:34:14 more
  • 選擇排序演算法之泛型優化

    選擇排序演算法 作業原理: 每一次從待排序的資料元素中選中最小的一個元素,然后,再從剩余未排序元素中繼續尋找最小元素,將2個元素交換位置,就達到了已排序的元素一直是從小到大了。 這個演算法的時間復雜度為O(n²),空間復雜度為O(1)。 /** * @Author: 翰林猿 * @Description ......

    uj5u.com 2023-05-26 08:34:10 more
  • 【PC遷移與管理】上海道寧為每個用戶和每個 PC 傳輸和遷移場景提

    PCmover 是一款可以自動將所有選定檔案、檔案夾、設定、用戶組態檔甚至應用程式,從舊PC傳輸、恢復和升級到新PC或作業系統的軟體 ......

    uj5u.com 2023-05-26 08:28:35 more
  • Selenium自動化測驗面試必備:高頻面試題及答案整理

    自動化測驗已經成為現代軟體測驗中不可或缺的一部分。在自動化測驗中,Selenium是最受歡迎的工具之一,因為它可以模擬用戶與Web應用程式的互動。因此,對于許多測驗工程師來說,熟練掌握Selenium框架是非常重要的。如果你正在尋找一份自動化測驗作業,那么你可能會被問到一些關于Selenium的面試... ......

    uj5u.com 2023-05-26 08:25:56 more
  • Pytest - setup 和 teardown

    ## Pytest - setup 和 teardown + 執行用例肯定有些需要前置條件或后置操作,例如前置的用戶登陸,后置的清理資料等操作; + unittest提供了兩種前置(setup、setupClass)和兩種后置(teardown、teardownClass); + 相比之下,pyte ......

    uj5u.com 2023-05-26 08:25:47 more