使用Python和百度语音识别生成视频字幕的实现


Posted in Python onApril 09, 2020

从视频中提取音频

安装 moviepy

pip install moviepy

相关代码:

audio_file = work_path + '\\out.wav'
video = VideoFileClip(video_file)
video.audio.write_audiofile(audio_file,ffmpeg_params=['-ar','16000','-ac','1'])

根据静音对音频分段

使用音频库 pydub,安装:

pip install pydub

第一种方法:

# 这里silence_thresh是认定小于-70dBFS以下的为silence,发现小于 sound.dBFS * 1.3 部分超过 700毫秒,就进行拆分。这样子分割成一段一段的。
sounds = split_on_silence(sound, min_silence_len = 500, silence_thresh= sound.dBFS * 1.3)


sec = 0
for i in range(len(sounds)):
 s = len(sounds[i])
 sec += s
print('split duration is ', sec)
print('dBFS: {0}, max_dBFS: {1}, duration: {2}, split: {3}'.format(round(sound.dBFS,2),round(sound.max_dBFS,2),sound.duration_seconds,len(sounds)))

使用Python和百度语音识别生成视频字幕的实现

感觉分割的时间不对,不好定位,我们换一种方法:

# 通过搜索静音的方法将音频分段
# 参考:https://wqian.net/blog/2018/1128-python-pydub-split-mp3-index.html
timestamp_list = detect_nonsilent(sound,500,sound.dBFS*1.3,1)
 
for i in range(len(timestamp_list)):
 d = timestamp_list[i][1] - timestamp_list[i][0]
 print("Section is :", timestamp_list[i], "duration is:", d)
print('dBFS: {0}, max_dBFS: {1}, duration: {2}, split: {3}'.format(round(sound.dBFS,2),round(sound.max_dBFS,2),sound.duration_seconds,len(timestamp_list)))

输出结果如下:

使用Python和百度语音识别生成视频字幕的实现

感觉这样好处理一些

使用百度语音识别

现在百度智能云平台创建一个应用,获取 API Key 和 Secret Key:

使用Python和百度语音识别生成视频字幕的实现

获取 Access Token

使用百度 AI 产品需要授权,一定量是免费的,生成字幕够用了。

'''
百度智能云获取 Access Token
'''
def fetch_token():
 params = {'grant_type': 'client_credentials',
    'client_id': API_KEY,
    'client_secret': SECRET_KEY}
 post_data = urlencode(params)
 if (IS_PY3):
  post_data = post_data.encode( 'utf-8')
 req = Request(TOKEN_URL, post_data)
 try:
  f = urlopen(req)
  result_str = f.read()
 except URLError as err:
  print('token http response http code : ' + str(err.errno))
  result_str = err.reason
 if (IS_PY3):
  result_str = result_str.decode()


 print(result_str)
 result = json.loads(result_str)
 print(result)
 if ('access_token' in result.keys() and 'scope' in result.keys()):
  print(SCOPE)
  if SCOPE and (not SCOPE in result['scope'].split(' ')): # SCOPE = False 忽略检查
   raise DemoError('scope is not correct')
  print('SUCCESS WITH TOKEN: %s EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
  return result['access_token']
 else:
  raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')

使用 Raw 数据进行合成

这里使用百度语音极速版来合成文字,因为官方介绍专有GPU服务集群,识别响应速度较标准版API提升2倍及识别准确率提升15%。适用于近场短语音交互,如手机语音搜索、聊天输入等场景。 支持上传完整的录音文件,录音文件时长不超过60秒。实时返回识别结果

def asr_raw(speech_data, token):
 length = len(speech_data)
 if length == 0:
  # raise DemoError('file %s length read 0 bytes' % AUDIO_FILE)
  raise DemoError('file length read 0 bytes')


 params = {'cuid': CUID, 'token': token, 'dev_pid': DEV_PID}
 #测试自训练平台需要打开以下信息
 #params = {'cuid': CUID, 'token': token, 'dev_pid': DEV_PID, 'lm_id' : LM_ID}
 params_query = urlencode(params)


 headers = {
  'Content-Type': 'audio/' + FORMAT + '; rate=' + str(RATE),
  'Content-Length': length
 }


 url = ASR_URL + "?" + params_query
 # print post_data
 req = Request(ASR_URL + "?" + params_query, speech_data, headers)
 try:
  begin = timer()
  f = urlopen(req)
  result_str = f.read()
  # print("Request time cost %f" % (timer() - begin))
 except URLError as err:
  # print('asr http response http code : ' + str(err.errno))
  result_str = err.reason


 if (IS_PY3):
  result_str = str(result_str, 'utf-8')
 return result_str

生成字幕

字幕格式: https://www.cnblogs.com/tocy/p/subtitle-format-srt.html

生成字幕其实就是语音识别的应用,将识别后的内容按照 srt 字幕格式组装起来就 OK 了。具体字幕格式的内容可以参考上面的文章,代码如下:

idx = 0
for i in range(len(timestamp_list)):
 d = timestamp_list[i][1] - timestamp_list[i][0]
 data = sound[timestamp_list[i][0]:timestamp_list[i][1]].raw_data
 str_rst = asr_raw(data, token)
 result = json.loads(str_rst)
 # print("rst is ", result)
 # print("rst is ", rst['err_no'][0])


 if result['err_no'] == 0:
  text.append('{0}\n{1} --> {2}\n'.format(idx, format_time(timestamp_list[i][0]/ 1000), format_time(timestamp_list[i][1]/ 1000)))
  text.append( result['result'][0])
  text.append('\n')
  idx = idx + 1
  print(format_time(timestamp_list[i][0]/ 1000), "txt is ", result['result'][0])
with open(srt_file,"r+") as f:
 f.writelines(text)

总结

我在视频网站下载了一个视频来作测试,极速模式从速度和识别率来说都是最好的,感觉比网易见外平台还好用。

到此这篇关于使用Python和百度语音识别生成视频字幕的文章就介绍到这了,更多相关Python 百度语音识别生成视频字幕内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
使用grappelli为django admin后台添加模板
Nov 18 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
kali中python版本的切换方法
Jul 11 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
python中判断文件结束符的具体方法
Aug 04 Python
python 统计list中各个元素出现的次数的几种方法
Feb 20 Python
利用Python制作动态排名图的实现代码
Apr 09 #Python
使用python接受tgam的脑波数据实例
Apr 09 #Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 #Python
Python 实现自动完成A4标签排版打印功能
Apr 09 #Python
python网络编程:socketserver的基本使用方法实例分析
Apr 09 #Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 #Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 #Python
You might like
图解上海144收音机
2021/03/02 无线电
PHP XML备份Mysql数据库
2009/05/27 PHP
PHP 超链接 抓取实现代码
2009/06/29 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
分享php多功能图片处理类
2016/05/15 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
淘宝搜索框效果实现分析
2011/03/05 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
JS实现轮播图效果
2020/01/11 Javascript
详解Vue之事件处理
2020/07/10 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python基础之函数用法实例详解
2014/09/10 Python
Python 备份程序代码实现
2017/03/06 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
Myholidays美国:在线旅游网站
2019/08/16 全球购物
Java如何格式化日期
2012/08/07 面试题
装潢设计专业推荐信模板
2013/11/26 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
婚姻出轨保证书
2015/05/08 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript