最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 用 Python 解决女朋友看电影没字幕的需求

    正文概述 掘金(TrueDei)   2020-12-24   727

    是这样子的,女朋友晚上突然翻到了自己喜欢看的一个电影,但是没有字幕,这让她很苦恼。我急中生智,紧急的解决了我女朋友的需求。用 Python 做一个可以识别语音,然后翻译出来文字的软件。

    一、故事情节

    是这样子的,女朋友晚上突然翻到了自己喜欢看的一个电影,但是没有字幕,这让她很苦恼。

    我急中生智,紧急的解决了我女朋友的需求。

    想到了使用 Python 做一个可以识别语音,然后翻译出来文字的软件。

    用 Python 解决女朋友看电影没字幕的需求

    如下图就是本片文章所要完成的效果,哈哈,是不是还不错,很棒的样子。

    如果有兴趣可以给我点个赞,之后带来更多好玩、有趣的 demo 和实现的教程。

    《甄嬛传》第一集的某一小段:

    用 Python 解决女朋友看电影没字幕的需求

    其实,是这样子的:

    最近剧荒,偶然翻出了曾经下载的电视剧回味一番,经典就是经典,不论是剧情还是台词,都那么有魅力,咦?等等,台词,台词…… 作为一个 IT 从业者,我忽然灵光一现——现在语音识别技术这么发达,能否有什么办法能帮我保存下一些精彩桥段的台词呢?或许我也可以是个野生字幕君: p , 似乎也可以在此基础上顺手再翻译一下个别难懂的台词!

    略加思索,我大概有了个想法——做个视频中提取音频的程序,而后去请求一个开放的语音识别 API 来帮我把语音转为文字。鉴于之前调用有道智云的愉快经验,我决定再次拿来为我所用,很快做出了这个 demo(请忽略这丑丑的界面布局,能用就行……)。

    用 Python 解决女朋友看电影没字幕的需求

    欢迎关注我,一块来履行我之前的承诺连更一个月之内,把几篇写完。

    序号预计完成时间开发 dome 名字以及功能 & 发布文章内容是否已写完文章链接
    19 月 3文本翻译,单文本翻译,批量翻译 demo。已完成CSDN:点我直达 微信公众号:点我直达29 月 11OCR-demo,完成批量上传识别; 在一个 demo 中可选择不同类型的 OCR 识别《包含手写体 / 印刷体 / 身份证 / 表格 / 整题 / 名片),然后调用平台能力,具体实现步骤等。已完成CSDN:点我直达 微信公众号:310 月 27语音识别 demo,demo 中上传—段视频,并截取视频中短语音识别 - demo 的一段音频进行短语音识别CSDN:点我直达 微信公众号:49 月 17智能语音评测 - demoCSDN: 微信公众号:59 月 24作文批改 - demoCSDN: 微信公众号:69 月 30语音合成 - demoCSDN: 微信公众号:710 月 15单题拍搜 - demoCSDN: 微信公众号:810 月 20图片翻译 - demoCSDN: 微信公众号:

    二、开发前的准备工作

    首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取调用接口用到的应用的 id 和密钥。具体个人注册的过程和应用创建过程详见文章不到 100 行代码搞定 Python 做 OCR 识别身份证,文字等各种字体

    用 Python 解决女朋友看电影没字幕的需求

    三、开发过程详细介绍

    下面介绍具体的代码开发过程。

    (一)接口规范说明

    首先分析有道智云的 API 输入输出规范。根据文档来看,调用接口格式如下:

    有道语音识别 API HTTPS 地址:

    https://openapi.youdao.com/asrapi
    

    接口调用参数:

    字段名类型含义必填备注
    qtext要翻译的音频文件的 Base64 编码字符串True必须是 Base64 编码langTypetext源语言True支持语言appKeytext应用 IDTrue可在 应用管理 查看salttextUUIDTrueUUIDcurtimetext时间戳(秒)true秒数signtext签名,通过 md5(应用 ID+q+salt+curTime + 密钥) 生成True应用 ID+q+salt+curTime + 密钥的 MD5 值signTypetext签名版本Truev2formattext语音文件的格式,wavtruewavratetext采样率, 推荐 16000 采用率true16000channeltext声道数, 仅支持单声道,请填写固定值 1true1typetext上传类型, 仅支持 base64 上传,请填写固定值 1true1

    其中 q 为 base64 编码的待识别音频文件,“上传的文件时长不能超过 120s,文件大小不能超过 10M”,这点需要注意一下。

    API 的返回内容较为简单:

    字段含义
    errorCode识别结果错误码,一定存在。 详细信息参加 错误代码列表result识别结果,识别成功一定存在

    (二)项目开发

    这个项目使用python3开发,包括maindow.pyvideoprocess.pysrbynetease.py三个文件。

    界面部分,使用 python 自带的tkinter库,提供视频文件选择、时间输入框和确认按钮;

    videoprocess.py: 来实现在视频的指定时间区间提取音频和处理 API 返回信息的功能;

    srbynetease.py: 将处理好的音频发送到短语音识别 API 并返回结果。

    1、界面部分的实现

    界面部分代码如下,比较简单。

    root=tk.Tk()
    root.title("netease youdao sr test")
    frm = tk.Frame(root)
    frm.grid(padx='50', pady='50')
    
    btn_get_file = tk.Button(frm, text='选择待识别视频', command=get_file)
    btn_get_file.grid(row=0, column=0,  padx='10', pady='20')
    path_text = tk.Entry(frm, width='40')
    path_text.grid(row=0, column=1)
    
    start_label=tk.Label(frm,text='开始时刻:')
    start_label.grid(row=1,column=0)
    start_input=tk.Entry(frm)
    start_input.grid(row=1,column=1)
    
    end_label=tk.Label(frm,text='结束时刻:')
    end_label.grid(row=2,column=0)
    end_input=tk.Entry(frm)
    end_input.grid(row=2,column=1)
    
    sure_btn=tk.Button(frm, text='开始识别', command=start_sr)
    sure_btn.grid(row=3,column=0,columnspan=3)
    root.mainloop()
    

    其中 sure_btn 的绑定事件 start_sr() 做了简单的异常处理,并通过弹窗打印最终的识别结果:

    def start_sr():
        print(video.video_full_path)
     if len(path_text.get())==0:
            sr_result = '未选择文件'
        else:
            video.start_time = int(start_input.get())
            video.end_time = int(end_input.get())
            sr_result=video.do_sr()
    
        tk.messagebox.showinfo("识别结果", sr_result)
    

    2、处理音视频功能开发

    (1)在 videoprocess.py 中,我用到了 python 的 moviepy 库来处理视频,按指定起止时间截取视频,提取音频,并按 API 要求转为 base64 编码形式:

    def get_audio_base64(self):
        video_clip=VideoFileClip(self.video_full_path).subclip(self.start_time,self.end_time)
        audio=video_clip.audio
        result_path=self.video_full_path.split('.')[0]+'_clip.mp3'
        audio.write_audiofile(result_path)
        audio_base64 = base64.b64encode(open(result_path,'rb').read()).decode('utf-8')
        return audio_base64
    

    (2)处理好的音频文件编码传到封装好的有道智云 API 调用方法中:

    def do_sr(self):
        audio_base64=self.get_audio_base64()
        sr_result=srbynetease.connect(audio_base64)
        print(sr_result)
        if sr_result['errorCode']=='0':
            return sr_result['result']
        else:
            return "Something wrong , errorCode:"+sr_result['errorCode']
    

    3、发送数据翻译功能的开发

    srbynetease.py 中封装的调用方法比较简单,按 API 文档 “组装” 好 data{}发送即可:

    def connect(audio_base64):
        data = {}
        curtime = str(int(time.time()))
        data['curtime'] = curtime
        salt = str(uuid.uuid1())
        signStr = APP_KEY + truncate(audio_base64) + salt + curtime + APP_SECRET
        sign = encrypt(signStr)
        data['appKey'] = APP_KEY
        data['q'] = audio_base64
        data['salt'] = salt
        data['sign'] = sign
        data['signType'] = "v2"
        data['langType'] = 'zh-CHS'
        data['rate'] = 16000
        data['format'] = 'mp3'
        data['channel'] = 1
        data['type'] = 1
    
        response = do_request(data)
    
        return json.loads(str(response.content,'utf-8'))
    

    四、效果展示

    随手打开《甄嬛传》第一集的某一小段试试:

    用 Python 解决女朋友看电影没字幕的需求

    效果可以,断句的一点小瑕疵可以忽略。没想到这短语音识别 API 博古通今,古文语音识别也这么溜,厉害厉害!

    五、总结

    一番尝试带我打开了新世界的大门,从今天开始我可以是一个不打字却能搬运字幕的野生字幕君了,后面再有时间可以试试识别完翻译成其他语言的操作,嗯,是技术的力量!

    项目地址:https://github.com/LemonQH/SRFromVideo


    起源地下载网 » 用 Python 解决女朋友看电影没字幕的需求

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元