老铁们,大家好,相信还有很多朋友对于中文字字幕11页中文乱码和教你1分钟搞定2小时字幕的相关问题不太懂,没关系,今天就由我来为大家分享分享中文字字幕11页中文乱码以及教你1分钟搞定2小时字幕的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
本文分享自华为云社区《利用录音文件极速版为视频生成字幕-云社区-华为云》,作者:戈兀。
引言越来越多的人们使用抖音、B站等视频app,记录、分享日常生活,随之互联网上产生了大量的长、短视频。字幕是影响视频观看体验的重要因素。以日常分享为主的视频创作者往往没有时间为视频制作字幕,在创作者发音不清楚的前提下,没有字幕的视频可能会让观众困惑甚至产生理解偏差。而带字幕的视频让观众有更好的观看体验,“一气呵成”顺畅地看完。
语音识别技术(AutomaticSpeechRecognition)是一种将人的语音转换为文本的技术。随着深度学习的发展,端到端语音识别技术也取得了巨大的突破。将原始的音频数据,经过分帧、加窗、FFT等操作后,得到描述音频在时、频域信息的梅尔特征或是Fbank特征。将特征送入transformer等神经网络,输出对应的文本信息。此外,由大量文本训练的语言模型(languagemodel)能够纠正语音识别输出文本不通顺的问题,改善阅读体验。而热词技术也被用来解决语音识别的领域适配问题,如同音不同字。
本文将介绍如何使用录音文件识别极速版给无字幕视频自动生成字幕。
录音文件识别极速版采用同步接口,利用GPU加速模型的推理过程。对于两个小时内的音、视频文件,可以在1分钟内返回识别结果,满足准实时字幕、音频质检等对识别速度有要求的场景。感兴趣的读者可以点击录音文件识别极速版文档(https://support.huaweicloud.com/api-sis/sis_03_0090.html),了解详情。
注:本文同步发布至华为云AIGalleryNotebook,可以在AIGallery上运行:利用录音文件极速版为视频生成字幕(AIGallery_Notebook详情_开发者_华为云)
原理讲解给无字幕视频生成字幕,就是从视频中的提取音频流,将音频流送入录音文件识别极速版,得到识别文字,和对应的时间戳信息。然后将其转换为视频字幕文件格式,如srt文件。得到srt字幕文件后,在播放视频时,载入字幕文件,就可以看到字幕了。
因此,整个流程如下:
1、利用ffmpeg工具,从视频中提取音频流
2、设置适合的参数,使用录音文件识别极速版,催音频文件进行识别
3、对识别结果,包括文字和时间戳信息,进行处理,得到视频字幕文件
4、将命名相同的视频文件与srt文件放在同一目录下,用播放器打开,即可得到有字幕的视频。或者利用ffmpeg,以硬字幕的形式,将字幕嵌入到视频中。
注:SRT(SubRip文件格式)是以SubRip文件格式保存的简单字幕文件,扩展名为.srt。每个字幕在SRT文件中有四个部分:
指示字幕编号或位置的数字计数器。字幕的开始和结束时间。一行或多行的字幕文本表示字幕结束的空行代码开发步骤一:提取音频流采用ffmpeg从视频文件中提取音频流,并保存为音频文件output.wav
ffmpeg-iinput.mp4-ar16000-ac1output.wav
-ar指定保存音频文件的采样率,这里16000表示1秒钟,保存16000个采样点数据;-ac指定保存音频的通道数,这里1表示保存为单通道音频。
步骤二:安装语音识别pythonSDK在安装python3后,用pip安装其他依赖依赖包
pipinstallsetuptoolsnpipinstallrequestsnpipinstallwebsocket-clientn
下载最新版pythonsdk源码:https://sis-sdk-repository.obs.cn-north-1.myhuaweicloud.com/python/huaweicloud-python-sdk-sis-1.8.1.zip
进入下载的PythonSDK目录,在setup.py所在层目录执行pythonsetup.pyinstall命令,完成SDK安装。
步骤三:调用录音文件极速版导入依赖包fromhuaweicloud_sis.client.flash_lasr_clientimportFlashLasrClientnfromhuaweicloud_sis.bean.flash_lasr_requestimportFlashLasrRequestnfromhuaweicloud_sis.exception.exceptionsimportClientExceptionnfromhuaweicloud_sis.exception.exceptionsimportServerExceptionnfromhuaweicloud_sis.bean.sis_configimportSisConfignimportjsonn初始化客户端
config=SisConfig()nconfig.set_connect_timeout(50)nconfig.set_read_timeout(50)nclient=FlashLasrClient(ak=ak,sk=sk,region=region,project_id=project_id,sis_config=config)n构造请求
asr_request=FlashLasrRequest()nasr_request.set_obs_bucket_name(obs_bucket_name)#设置存放音频的桶名,必选nasr_request.set_obs_object_key(obs_object_key)#设置OBS桶中的对象的键值,必选nasr_request.set_audio_format(audio_format)#音频格式,必选nasr_request.set_property(property)#property,比如:chinese_16k_conversationnasr_request.set_add_punc('yes')nasr_request.set_digit_norm('no')nasr_request.set_need_word_info('yes')nasr_request.set_first_channel_only('yes')n
为视频产生字幕文件时,不仅需要文字,也需要文字对应的时间戳信息。当一句话过长,屏幕无法完整显示时,就需要对这句话进行切分。因此,仅仅根据每个句子的起始和截止时间,无法准确的确定切分后两句话的起始和截止时间。因此我们需要字级别的时间信息。而将need_word_info配置为’yes’,就可以输出字级别的时间戳信息。如下:
"word_info":[n{n"start_time":590,n"word":"哎",n"end_time":630n},n{n"start_time":830,n"word":"大",n"end_time":870n},n{n"start_time":950,n"word":"家",n"end_time":990n},n{n"start_time":1110,n"word":"好",n"end_time":1150n},n]n接下里发送识别请求
result=client.get_flash_lasr_result(asr_request)n拿到带有详细时间戳信息的识别结果result:
"result":{n"score":0.9358551502227783,n"word_info":[n{n"start_time":590,n"word":"哎",n"end_time":630n},n{n"start_time":830,n"word":"大",n"end_time":870n},n{n"start_time":950,n"word":"家",n"end_time":990n},n{n"start_time":1110,n"word":"好",n"end_time":1150n},n{n"start_time":1750,n"word":"我",n"end_time":1790n},n{n"start_time":1910,n"word":"是",n"end_time":1950n},n{n"start_time":2070,n"word":"你",n"end_time":2110n},n{n"start_time":2190,n"word":"们",n"end_time":2230n},n{n"start_time":2350,n"word":"的",n"end_time":2390n},n{n"start_time":2870,n"word":"音",n"end_time":2910n},n{n"start_time":3030,n"word":"乐",n"end_time":3070n},n{n"start_time":3190,n"word":"老",n"end_time":3230n},n{n"start_time":3350,n"word":"师",n"end_time":3390n},n{n"start_time":3590,n"word":"康",n"end_time":3630n},n{n"start_time":3750,n"word":"老",n"end_time":3790n},n{n"start_time":3950,n"word":"师",n"end_time":3990n},n{n"start_time":4830,n"word":"那",n"end_time":4870n},n{n"start_time":4990,n"word":"么",n"end_time":5030n},n{n"start_time":5350,n"word":"这",n"end_time":5390n},n{n"start_time":5550,n"word":"几",n"end_time":5590n},n{n"start_time":5750,n"word":"系",n"end_time":5790n},n{n"start_time":5870,n"word":"列",n"end_time":5910n},n{n"start_time":6070,n"word":"呢",n"end_time":6110n},n{n"start_time":6310,n"word":"我",n"end_time":6350n},n{n"start_time":6390,n"word":"们",n"end_time":6470n},n{n"start_time":6510,n"word":"来",n"end_time":6550n},n{n"start_time":6670,n"word":"到",n"end_time":6710n},n{n"start_time":6830,n"word":"了",n"end_time":6870n},n{n"start_time":7430,n"word":"发",n"end_time":7470n},n{n"start_time":7630,n"word":"声",n"end_time":7670n},n{n"start_time":7830,n"word":"练",n"end_time":7870n},n{n"start_time":8030,n"word":"习",n"end_time":8070n},n{n"start_time":8950,n"word":"三",n"end_time":8990n},n{n"start_time":9190,n"word":"十",n"end_time":9230n},n{n"start_time":9350,n"word":"五",n"end_time":9390n},n{n"start_time":9470,n"word":"讲",n"end_time":9510n}n],n"text":"哎,大家好,我是你们的音乐老师康老师。那么这几系列呢,我们来到了发声练习三十五讲。"n},n"start_time":510,n"end_time":9640n}n步骤四:将识别结果转为srt字幕格式文件
由于视频播放界面的宽度有限,当一句话包含的文字数过多时,会存在一行放不下的问题。因此我们在生成srt文件时,需要将文字数量过长的一句话切分为两句话,分别在不同的时间段显示。企切分后的第一句话的起始时间不变,截止时间为最后一个字的截止时间;第二句话的起始时间为第一个字的起始时间,截止时间不变。这样就保证切分后两句话的时间戳也是正确的,进而在合适的视频帧中显示正确的文本内容。
defjson2srt(json_result):nresults=""ncount=1nmax_word_in_line=15nmin_word_in_line=3npunc=["。","?","!",","]nsegments=json_result['flash_result'][0]['sentences']nforiinrange(len(segments)):ncurrent_result=segments[i]ncurrent_sentence=current_result["result"]["text"]niflen(current_result["result"]["word_info"])>max_word_in_line:nsrt_result=""nsrt_result_len=0ncurrent_segment=""ncnt=0nstart=Truenforiinrange(len(current_sentence)):nifcurrent_sentence[i]notinpunc:nifstart:nstart_time=current_result["result"]["word_info"][cnt]['start_time']nstart=Falsenelse:nend_time=current_result["result"]["word_info"][cnt]['end_time']ncurrent_segment+=current_sentence[i]nsrt_result_len+=1ncnt+=1nelse:nifsrt_result_len<min_word_in_line:nsrt_result+=current_segment+current_sentence[i]ncurrent_segment=""nelse:nsrt_result+=current_segment+current_sentence[i]ncurrent_segment=""nstart_time=time_format(start_time)nend_time=time_format(end_time)nifsrt_result[-1]==",":nsrt_result=srt_result[:-1]nresults+=str(count)+"\n"+start_time+"-->"+end_time+"\n"+srt_result+"\n"+"\n"ncount+=1nstart=Truensrt_result=""nelse:nstart_time=time_format(current_result["start_time"])nend_time=time_format(current_result["end_time"])nifcurrent_sentence[-1]==",":ncurrent_sentence=current_sentence[:-1]nresults+=str(count)+"\n"+start_time+"-->"+end_time+"\n"+current_sentence+"\n"+"\n"ncount+=1nreturnresultsn
得到srt格式的字幕文件
步骤五:播放视频,载入字幕修改文件名,保证srt文件和原始视频文件命名相同,然后用暴风影音播放视频:
步骤六:使用ffmpeg给视频添加硬字幕(可选)ffmpeg-iinput.mp4-vfsubtitles=subtitle.srtoutput_srt.mp4n
注:硬字幕是将字幕渲染到视频的纹理上,然后将其编码成独立于视频格式的一个完整视频。硬字幕与视频是一个整体,不能更改或删除。
关注#华为云开发者联盟#u0002点击下方,第一时间了解华为云新鲜技术~
华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云
OK,关于中文字字幕11页中文乱码和教你1分钟搞定2小时字幕的内容到此结束了,希望对大家有所帮助。
还没有评论,来说两句吧...