当前位置:   article > 正文

AI技术实践|用腾讯云录音文件识别让无字幕视频自动生成字幕_视频文件ai解析字幕 api

视频文件ai解析字幕 api

试想一下,当我们在观看一段视频时,如果遇上字幕缺失,观感是不是会大打折扣?

近些年,短视频、直播等线上娱乐方式快速发展,直接拉动了旅游、电商、影视创作等行业新风潮;而要呈现出一段好的视频效果,不仅仅考验好的拍摄技法,后期处理也是重中之重。以视频字幕为例,有字幕的视频总能“一气呵成”的顺畅看完,而无字幕的,总令人觉得缺失了一种味道。事实上,纯手工添加字幕,也费时费力,面对较大时长与批量化字幕处理的,多少有些苦不堪言,那有没有更智能化的方式呢?

接下来,本文将分享一下,如何借助录音文件识别服务给无字幕视频自动生成字幕。

一、分析调研

给无字幕视频自动生成字幕,其实就是先对视频文件导出的音频文件进行识别,得到识别文字,再根据识别得到的文字与短句的时间信息处理得到视频srt字幕文件,在视频文件中导入srt字幕文件即可得到效果。

实现思路如下:

1.借助ffmpeg从视频中提取音频

2.调用录音文件识别服务,对音频文件进行识别

3.对识别得到的文字与短句的时间信息进行处理得到视频srt字幕文件

4.将命名相同的视频文件与srt文件放在同一目录下,用暴风影音或其他播放器打开,即可得到有字幕的视频。

二、代码开发

1.借助ffmpeg从视频中提取音频

项目使用了ffmpeg依赖,需先下载安装,并设置环境变量。之后就可通过引入subprocess库,执行ffmpeg命令,启动一个新进程,完成对音频的提取。

  1. import subprocess
  2. def extract_audio(video, tmpAudio):
  3. ret = subprocess.run('ffmpeg -version', shell=True)
  4. if ret.returncode != 0:
  5. print("请先安装 ffmpeg 依赖 ,并设置环境变量")
  6. return
  7. ret = subprocess.check_call(['ffmpeg', '-i', video, '-vn', '-ar', "16000", tmpAudio], shell=False)
  8. if ret.returncode != 0:
  9. print("error:", ret)

2.识别音频文件

在这里笔者选择的录音文件识别服务是腾讯云ASR的录音文件识别,通过调研,腾讯云的录音文件识别,可以在调用时直接根据语句之间的停顿智能断句、加标点,无需再调用其他接口进行语句拆分,同时返回结果数据也可根据不同需求进行多种选择,如是否过滤脏词、是否过滤语气词等。

 

服务具体详细信息这里不再赘述,详情见官方文档见腾讯云ASR

(1)要访问腾讯云的服务,则需要SecertId与SecretKey,该API密钥可在API密钥管理页面新建与查询,稍后配置到config文件中即可。

 

笔者项目配置在tencent/config.py当中

  1. class Config(object):
  2. OUTPUT_PATH = '/XXX/video-srt/audio/' #输出文件目录
  3. APP_ID = '******' # 对应上述APPID
  4. SECRET_ID = '******' # 对应上述SecretId
  5. SECRET_KEY = '******' # 对应上述SecretKey

(2)使用官网提供的sdk

找到腾讯云语音识别服务下的录音文件识别的API文档,滑动到下方,找到开发者资源,这里笔者选择调用Python SDK。

 

可以看到录音文件识别是个异步服务,可通过CreateRecTask接口发送录音文件识别请求,之后可通过DescribeTaskStatus接口查询识别结果。

笔者项目中函数create_rec、函数query_rec_task分别对CreateRecTask接口和DescribeTaskStatus接口进行了封装。详细介绍如下:

CreateRecTask:

在请求时除需传入EngineModelType(引擎模型类型)、ChannelNum(识别声道数)、ResTextFormat(识别结果返回形式)、SourceType(语音数据来源)等这些必选参数外,还可根据需要传入FilterDirty(是否过滤脏词)、FilterModal(是否过滤语气词)等参数。

该请求成功后将返回RequestId、TaskId等信息。

  1. def create_rec(engine_type, file_url):
  2. client = create_client(Config.SECRET_ID, Config.SECRET_KEY)
  3. req = models.CreateRecTaskRequest()
  4. params = {"ChannelNum": 1, "ResTextFormat": 2, "SourceType": 0, "ConvertNumMode": 1}
  5. req._deserialize(params)
  6. req.EngineModelType = engine_type
  7. req.Url = file_url
  8. try:
  9. resp = client.CreateRecTask(req)
  10. logger.info(resp)
  11. requesid = resp.RequestId
  12. taskid = resp.Data.TaskId
  13. return requesid, taskid
  14. except Exception as err:
  15. logger.info(traceback.format_exc())
  16. return None, None

这里需要注意两个参数:

一是,ResTextFormat。识别结果返回形式有三种,这里笔者因在后续生成srt文件时,还根据单句识别结果的标点进行了一层分隔,所以选用了“词级别粒度的详细识别结果(包含标点、语速值)”的形式,若是不需要多一层划分,可直接选用“识别结果文本(含分段时间戳)”的形势。

 

二是,SourceType。语音数据来源分为两种,分别是语音 URL和语音数据(post body),笔者这里选用的是语音 URL,具体实现为,将本地音频上传到腾讯云的cos存储桶中,则语音URL为固定地址+音频文件名,即可实现调用。也可通过其他方式得到音频的url。

  1. import subprocess
  2. def upload_file(tmpAudio):
  3. objectName = tmpAudio.split('/')[-1]
  4. ret = subprocess.run(['coscmd', '-s', 'upload', tmpAudio, objectName], shell=False)
  5. if ret.returncode != 0:
  6. print("error:", ret)

DescribeTaskStatus:

在请求时需传入TaskId。

该请求成功后将返回RequestId和识别结果。

  1. def query_rec_task(taskid):
  2. client = create_client(Config.SECRET_ID, Config.SECRET_KEY)
  3. req = models.DescribeTaskStatusRequest()
  4. params = '{"TaskId":' + str(taskid) + '}'
  5. req.from_json_string(params)
  6. result = ""
  7. while True:
  8. try:
  9. resp = client.DescribeTaskStatus(req)
  10. resp_json = resp.to_json_string()
  11. logger.info(resp_json)
  12. resp_obj = json.loads(resp_json)
  13. if resp_obj["Data"]["StatusStr"] == "success":
  14. result = resp_obj["Data"]["ResultDetail"]
  15. break
  16. if resp_obj["Data"]["Status"] == 3:
  17. return False, ""
  18. time.sleep(1)
  19. except TencentCloudSDKException as err:
  20. logger.info(err)
  21. return False, ""
  22. return True, result

这里笔者将根据ResultDetail的信息生成srt文件,所以函数query_rec_task的返回值为DescribeTaskStatus接口返回的data中的ResultDetail。

3.处理识别结果生成srt字幕文件

笔者这里生成的srt文件除了根据调用接口已自动划分的句子进行时间的标注外,当自动划分的句子的长度较长时,还会根据当前句子的标点,结合ResultDetail中的OffsetEndMs、StartMs、EndMs等信息对句子进行再一次分割,避免字幕一行展示过多的情况。

  1. def to_srt(src_txt):
  2. flag_word = ["。", "?", "!", ","]
  3. basic_line = 15
  4. srt_txt = ""
  5. count = 1
  6. for i in range(len(src_txt)):
  7. current_sentence = src_txt[i]["FinalSentence"]
  8. last_time = ms_to_hours(src_txt[i]["StartMs"])
  9. len_rec = len(current_sentence)
  10. if len_rec > basic_line:
  11. start_rec = 0
  12. last_time = ms_to_hours(src_txt[i]["StartMs"])
  13. while(len_rec > basic_line):
  14. flag = True
  15. for j in flag_word:
  16. if j in current_sentence[start_rec:start_rec+basic_line]:
  17. loc_rec = current_sentence.index(j, start_rec, start_rec+basic_line) + 1
  18. flag = False
  19. break
  20. if flag:
  21. loc_rec = start_rec + basic_line
  22. current_txt = current_sentence[start_rec:loc_rec] + "\n"
  23. start_time = last_time
  24. end_time = ms_to_hours(src_txt[i]["Words"][loc_rec]["OffsetEndMs"]+src_txt[i]["StartMs"])
  25. if current_sentence[start_rec:] != "" and current_sentence[start_rec:] != None:
  26. srt_txt = srt_txt + str(count) + "\n" + start_time + "-->" + end_time + "\n" + current_txt + "\n"
  27. count += 1
  28. start_rec = loc_rec
  29. last_time = end_time
  30. len_rec = len(current_sentence[loc_rec:])
  31. current_txt = current_sentence[start_rec:] + "\n"
  32. start_time = last_time
  33. end_time = ms_to_hours(src_txt[i]["EndMs"])
  34. if current_sentence[start_rec:] != "" and current_sentence[start_rec:] != None:
  35. srt_txt = srt_txt + str(count) + "\n" + start_time + "-->" + end_time + "\n" + current_txt + "\n"
  36. count += 1
  37. else:
  38. start_time = last_time
  39. end_time = ms_to_hours(src_txt[i]["EndMs"])
  40. srt_txt = srt_txt + str(count) + "\n" + start_time + "-->" + end_time + "\n" + current_sentence + "\n"+"\n"
  41. count += 1
  42. return srt_txt

 

这里srt文件最终生成的位置与Config文件中的OUTPUT_PATH相关。

4.得到有字幕的视频。

(1)原视频文件的名称需与srt文件相同

 

(2)选择打开方式

 

(3)有字幕的视频

 

至此,给无字幕视频生成字幕已经实现,完整工程代码放在附录中,除去修改一些配置,使用起来较为简便,欢迎感兴趣的同学前来使用!

附录

工程代码:GitHub - ForestSkyzzx/video-srt: 用腾讯云AI录音文件识别让无字幕视频自动生成字幕

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号