请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 7943|回复: 6

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

[复制链接]

17

主题

28

帖子

292

积分

中级会员

Rank: 3Rank: 3

积分
292
发表于 2020-1-27 07:21:44 | 显示全部楼层 |阅读模式
                                            Stm32 学习笔记                        因为学习 Stm32 开发,将开发过程中的点点滴滴记录下来。                        
孙亖                                                                ¥9.90                                                                                                                        去订阅
                                                                                                                                                                                                                        
文章目录


从视频中提取音频

安装 moviepy
  1. pip install moviepy
复制代码
相关代码:
  1. audio_file = work_path + '\\out.wav'video = VideoFileClip(video_file)video.audio.write_audiofile(audio_file,ffmpeg_params=['-ar','16000','-ac','1'])
复制代码
根据静音对音频分段

使用音频库 pydub,安装:
  1. pip install pydub
复制代码
第一种方法:
  1. # 这里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 = 0for i in range(len(sounds)):    s = len(sounds[i])    sec += sprint('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)))
复制代码

感觉分割的时间不对,不好定位,我们换一种方法:
  1. # 通过搜索静音的方法将音频分段# 参考:https://wqian.net/blog/2018/1128-python-pydub-split-mp3-index.htmltimestamp_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)))
复制代码
输出结果如下:

感觉这样好处理一些
使用百度语音识别

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

获取 Access Token

使用百度 AI 产品需要授权,一定量是免费的,生成字幕够用了。
  1. '''百度智能云获取 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秒。实时返回识别结果
  1. 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 了。具体字幕格式的内容可以参考上面的文章,代码如下:
  1. idx = 0for 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)
复制代码
总结

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

                                                使用百度语音识别生成字幕
                    
                                                                                                                                       
                                                    
  • 点赞                        3                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        孙亖                                                                                    博客专家                                                                                            发布了195 篇原创文章 · 获赞 47 · 访问量 3万+                                                                                            私信                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:前端与Nginx[介绍,安装,负载均衡调度,算法,配置]
下一篇:Dart 数据类型,看这篇就够了!
回复

使用道具 举报

0

主题

22

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
发表于 2020-1-28 18:02:13 | 显示全部楼层
既然你诚信诚意的推荐了,那我就勉为其难的看看吧![www.12360.co]
回复

使用道具 举报

0

主题

25

帖子

535

积分

高级会员

Rank: 4

积分
535
发表于 2020-2-11 00:42:01 | 显示全部楼层
楼主,我太崇拜你了![www.12360.co]
社区不能没有像楼主这样的人才啊!
回复

使用道具 举报

0

主题

18

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
发表于 2020-2-11 10:34:41 | 显示全部楼层
我看不错噢 谢谢楼主![www.12360.co]
回复

使用道具 举报

0

主题

14

帖子

304

积分

中级会员

Rank: 3Rank: 3

积分
304
发表于 2020-2-13 18:29:23 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享![www.12360.co]
回复

使用道具 举报

0

主题

19

帖子

409

积分

中级会员

Rank: 3Rank: 3

积分
409
发表于 2020-2-19 21:11:27 | 显示全部楼层
楼主太厉害了!楼主,I*老*虎*U![www.12360.co]
回复

使用道具 举报

0

主题

24

帖子

514

积分

高级会员

Rank: 4

积分
514
发表于 5 天前 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-29 22:00 , Processed in 0.365650 second(s), 33 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表