最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 沃德天,Python 竟然还能做实时翻译

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

    沃德天,Python 竟然还能做实时翻译

    沃德天,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: 微信公众号:

    最近,某水果手机厂在万众期待中开了一场没有发布万众期待的手机产品的发布会,发布了除手机外的其他一些产品,也包括最新的水果 14 系统。几天后,更新了系统的吃瓜群众经过把玩突然发现新系统里一个超有意思的功能——翻译,比如这种:

    奇怪的翻译知识增加了!

    相比常见的翻译工具,同声翻译工具更具有实用价值,想想不精通其他语言就能和歪果朋友无障碍交流的场景,真是一件美事,不如自己动手实现个工具备用! 一个同声翻译工具,逻辑大概可以是先识别,而后翻译,翻译能否成功,识别的准确率是个关键因素。为了降低难度,我决定分两次完成工具开发。首先来实现试试语音识别的部分。

    轻车熟路,本次的 demo 继续调用有道智云 API,实现实时语音识别。

    先看看界面和结果哈:

    可以选择多种语音,这里只写了四种常见的:

    沃德天,Python 竟然还能做实时翻译

    我分别测试的中文、韩文、英文。看着还不错哦~

    沃德天,Python 竟然还能做实时翻译

    沃德天,Python 竟然还能做实时翻译

    这里翻译结果,是根据音频一个字、一个字这样实时识别的,由于识别速度比较快,所以看起来木有时间差。

    首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取调用接口用到的应用的 id 和密钥。具体个人注册的过程和应用创建过程详见文章分享一次批量文件翻译的开发过程

    沃德天,Python 竟然还能做实时翻译

    (一)准备工作

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

    首先是根据实时语音识别文档来分析接口的输入输出。接口设计的目的是对连续音频流的实时识别,转换成文本信息并返对应文字流,因此通信采用 websocket,调用过程分为认证、实时通信两阶段。

    在认证阶段,需发送以下参数:

    参数类型必填说明示例
    appKeyString已申请的应用 IDIDsaltStringUUIDUUIDcurtimeString时间戳(秒)TimeStampsignString加密数字签名。sha256signTypeString数字签名类型v4langTypeString语言选择,参考支持语言列表zh-CHSformatString音频格式,支持 wavwavchannelString声道,支持 1(单声道)1versionStringapi 版本v1rateString采样率16000

    签名sign生成方法如下: signType=v4; sign=sha256(应用ID+salt+curtime+应用密钥)。

    认证之后,就进入了实时通信阶段,发送音频流,获取识别结果,最后发送结束标志结束通信,这里需要注意的是,发送的音频最好是 16bit 位深的单声道、16k 采样率的清晰的 wav 音频文件,这里我开发时最开始因为音频录制设备有问题,导致音频效果极差,接口一直返回错误码 304(手动捂脸)。

    (二)开发

    这个 demo 使用 python3 开发,包括 maindow.py,audioandprocess.py,recobynetease.py 三个文件。界面部分,使用 python 自带的 tkinter 库,来进行语言选择、录音开始、录音停止并识别的操作。audioandprocess.py 实现了录音、音频处理的逻辑,最后通过 recobynetease.py 中的方法来调用实时语音识别 API。

    1、界面部分

    主要元素:

    root=tk.Tk()
    root.title("netease youdao translation test")
    frm = tk.Frame(root)
    frm.grid(padx='80', pady='80')
    
    label=tk.Label(frm,text='选择语言类型:')
    label.grid(row=0,column=0)
    combox=ttk.Combobox(frm,textvariable=tk.StringVar(),width=38)
    combox["value"]=lang_type_dict
    combox.current(0)
    combox.bind("<<ComboboxSelected>>",get_lang_type)
    combox.grid(row=0,column=1)
    
    btn_start_rec = tk.Button(frm, text='开始录音', command=start_rec)
    btn_start_rec.grid(row=2, column=0)
    
    lb_Status = tk.Label(frm, text='Ready', anchor='w', fg='green')
    lb_Status.grid(row=2,column=1)
    
    btn_sure=tk.Button(frm,text="结束并识别",command=get_result)
    btn_sure.grid(row=3,column=0)
    
    root.mainloop()
    

    选择语言类型之后,开始录音,录音结束后,通过 get_result() 方法调用接口进行识别。

    def get_result():
        lb_Status['text']='Ready'
        sr_result=au_model.stop_and_recognise()
    

    2、音频录制部分的开发

    音频录制部分引入 pyaudio 库(需通过 pip 安装)来调用音频设备并录制接口要求的 wav 文件,并调用 wave 库存储音频文件。

    Audio_model 类的构造:

        def __init__(self, audio_path, language_type,is_recording):
            self.audio_path = audio_path,					
            self.audio_file_name=''							
            self.language_type = language_type,				
            self.language_dict=["zh-CHS","en","ja","ko"]	
            self.language=''
            self.is_recording=is_recording					
            self.audio_chunk_size=1600						
            self.audio_channels=1
            self.audio_format=pyaudio.paInt16
            self.audio_rate=16000
    

    (2)record() 方法的开发

    record() 方法中实现了录音的逻辑,调用 pyaudio 库,读取音频流,写入文件。

        def record(self,file_name):
            p=pyaudio.PyAudio()
            stream=p.open(
                format=self.audio_format,
                channels=self.audio_channels,
                rate=self.audio_rate,
                input=True,
                frames_per_buffer=self.audio_chunk_size
            )
            wf = wave.open(file_name, 'wb')
            wf.setnchannels(self.audio_channels)
            wf.setsampwidth(p.get_sample_size(self.audio_format))
            wf.setframerate(self.audio_rate)
    
            
            while self.is_recording:
                data = stream.read(self.audio_chunk_size)
                wf.writeframes(data)
            wf.close()
            stream.stop_stream()
            stream.close()
            p.terminate()
    

    (3)stop_and_recognise() 方法的开发

    stop_and_recognise() 方法将 Audio_model 的录音状态标记为 false,并启动调用有道智云 API 的方法。

        def stop_and_recognise(self):
            self.is_recording=False
            recognise(self.audio_file_name,self.language_dict[self.language_type])
    

    3、实时语音识别部分的开发

    有道智云实时语音识别接口使用 socket 通信,为简化展示逻辑,因此在此处发开了展示识别结果的界面,使用 tkinter 显示:

    root = tk.Tk()
    root.title("result")
    frm = tk.Frame(root)
    frm.grid(padx='80', pady='80')
    text_result = tk.Text(frm, width='40', height='20')
    text_result.grid(row=0, column=1)
    

    recognise() 方法根据接口文档,将所需参数拼接到 uri,传给 start() 方法请求接口:

    def recognise(filepath,language_type):
        print('l:'+language_type)
        global file_path
        file_path=filepath
        nonce = str(uuid.uuid1())
        curtime = str(int(time.time()))
        signStr = app_key + nonce + curtime + app_secret
        print(signStr)
        sign = encrypt(signStr)
    
        uri = "wss://openapi.youdao.com/stream_asropenapi?appKey=" + app_key + "&s&curtime=" + curtime + \
              "&sign=" + sign + "&version=v1&channel=1&format=wav&signType=v4&rate=16000&langType=" + language_type
        print(uri)
        start(uri, 1600)
    

    start() 方法是实时识别部分的核心方法,通过 websocket 调用识别接口。

    def start(uri):
    
        websocket.enableTrace(True)
    
        ws = websocket.WebSocketApp(uri,
                                    on_message=on_message,
                                    on_error=on_error,
                                    on_close=on_close)
    
        ws.on_open = on_opend
        ws.run_forever()
    

    在请求接口时,首先读取先前录制的音频文件,并发送:

    def on_open(ws):
        count = 0
        file_object = open(file_path, 'rb')  
        while True:
            chunk_data = file_object.read(1600)
            ws.send(chunk_data, websocket.ABNF.OPCODE_BINARY)  
            time.sleep(0.05)
            count = count + 1
            if not chunk_data:
                break
        print(count)
        ws.send('{\"end\": \"true\"}', websocket.ABNF.OPCODE_BINARY)
    

    而后在通信过程中处理接口返回的消息,收集接口返回的识别结果:

    def on_message(ws, message):
        result=json.loads(message)
        resultmessage= result['result']  
        
        if resultmessage:
            resultmessage1 = result['result'][0]
            resultmessage2 = resultmessage1["st"]['sentence']
            print(resultmessage2)
            
            result_arr.append(resultmessage2)
    

    最后在通信结束后展示识别结果:

    def on_close(ws):
        print_resule(result_arr)
        print("### closed ###")
        
    def print_resule(arr):
        text_result.delete('1.0',tk.END)
        for n in arr:
            text_result.insert("insert", n + '\n')
    

    有道智云提供的接口一如既往的好用,这次开发主要的精力全都浪费在了由于我自己录制的音频质量差而识别失败的问题上,音频质量 ok 后,识别结果准确无误,下一步就是拿去翻译了,有了有道智云 API,实现实时翻译也可以如此简单!


    起源地下载网 » 沃德天,Python 竟然还能做实时翻译

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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