热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python语音websocket_利用Python实现录音播放并翻译,真正的实时进行翻译

文章目录有了它,实现实时翻译还远吗?一、还有3秒到达战场二、效果展示四、调用API接口的准备工作五、开发过程详细介绍(一)准备工作(二)开发1、界面部分

文章目录
  • 有了它,实现实时翻译还远吗?
  • 一、还有3秒到达战场
  • 二、效果展示
  • 四、调用API接口的准备工作
  • 五、开发过程详细介绍
  • (一)准备工作(二)开发1、界面部分2、音频录制部分的开发(2)record()方法的开发(3)stop_and_recognise()方法的开发3、实时语音识别部分的开发
  • 五、总结

私信小编001即可获取大量Python学习资料

有了它,实现实时翻译还远吗?
a1aeccae09aee1b174ab79bc255049f3.png

一、还有3秒到达战场

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

奇怪的翻译知识增加了!

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

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

二、效果展示

先看看界面和结果哈:

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

b0c1e0086567369bf5c3ffc8ca3d0e28.png

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

45f2fe85c2e5a85a610c2cab14635b9c.png
03e1568c662e7ae3db1be63770990459.gif

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

四、调用API接口的准备工作

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

dbeaad2dd6dba29aba19f03d993dc3df.png

五、开发过程详细介绍

(一)准备工作

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

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

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

参数类型必填说明示例appKeyString是已申请的应用IDIDsaltString是UUIDUUIDcurtimeString是时间戳(秒)TimeStampsignString是加密数字签名。sha256signTypeString是数字签名类型v4langTypeString是语言选择,参考支持语言列表zh-CHSformatString是音频格式,支持wavwavchannelString是声道,支持1(单声道)1versionString是api版本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&#61;tk.Tk()root.title("netease youdao translation test")frm &#61; tk.Frame(root)frm.grid(padx&#61;&#39;80&#39;, pady&#61;&#39;80&#39;)label&#61;tk.Label(frm,text&#61;&#39;选择语言类型&#xff1a;&#39;)label.grid(row&#61;0,column&#61;0)combox&#61;ttk.Combobox(frm,textvariable&#61;tk.StringVar(),width&#61;38)combox["value"]&#61;lang_type_dictcombox.current(0)combox.bind("<>",get_lang_type)combox.grid(row&#61;0,column&#61;1)btn_start_rec &#61; tk.Button(frm, text&#61;&#39;开始录音&#39;, command&#61;start_rec)btn_start_rec.grid(row&#61;2, column&#61;0)lb_Status &#61; tk.Label(frm, text&#61;&#39;Ready&#39;, anchor&#61;&#39;w&#39;, fg&#61;&#39;green&#39;)lb_Status.grid(row&#61;2,column&#61;1)btn_sure&#61;tk.Button(frm,text&#61;"结束并识别",command&#61;get_result)btn_sure.grid(row&#61;3,column&#61;0)root.mainloop()

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

def get_result(): lb_Status[&#39;text&#39;]&#61;&#39;Ready&#39; sr_result&#61;au_model.stop_and_recognise()

2、音频录制部分的开发

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

Audio_model类的构造&#xff1a;

def __init__(self, audio_path, language_type,is_recording): self.audio_path &#61; audio_path,# 录音存储路径 self.audio_file_name&#61;&#39;&#39;# 录音文件名 self.language_type &#61; language_type,# 录音语言类型 self.language_dict&#61;["zh-CHS","en","ja","ko"]# 支持的语言&#xff0c;用于从UI出的类型转为接口所需类型 self.language&#61;&#39;&#39; self.is_recording&#61;is_recording# 录音状态 self.audio_chunk_size&#61;1600# 以下为一些接口所要求的录音参数&#xff0c;采样率、编码、通道等 self.audio_channels&#61;1 self.audio_format&#61;pyaudio.paInt16 self.audio_rate&#61;16000

(2)record()方法的开发

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

def record(self,file_name): p&#61;pyaudio.PyAudio() stream&#61;p.open( format&#61;self.audio_format, channels&#61;self.audio_channels, rate&#61;self.audio_rate, input&#61;True, frames_per_buffer&#61;self.audio_chunk_size ) wf &#61; wave.open(file_name, &#39;wb&#39;) wf.setnchannels(self.audio_channels) wf.setsampwidth(p.get_sample_size(self.audio_format)) wf.setframerate(self.audio_rate) # 读取数据写入文件 while self.is_recording: data &#61; 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&#xff0c;并启动调用有道智云API的方法。

def stop_and_recognise(self): self.is_recording&#61;False recognise(self.audio_file_name,self.language_dict[self.language_type])

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

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

#输出结果的窗口root &#61; tk.Tk()root.title("result")frm &#61; tk.Frame(root)frm.grid(padx&#61;&#39;80&#39;, pady&#61;&#39;80&#39;)text_result &#61; tk.Text(frm, width&#61;&#39;40&#39;, height&#61;&#39;20&#39;)text_result.grid(row&#61;0, column&#61;1)

recognise()方法根据接口文档&#xff0c;将所需参数拼接到uri&#xff0c;传给start()方法请求接口&#xff1a;

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

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

def start(uri): websocket.enableTrace(True) ws &#61; websocket.WebSocketApp(uri, on_message&#61;on_message, on_error&#61;on_error, on_close&#61;on_close) ws.on_open &#61; on_opend ws.run_forever()

在请求接口时&#xff0c;首先读取先前录制的音频文件&#xff0c;并发送&#xff1a;

def on_open(ws): count &#61; 0 file_object &#61; open(file_path, &#39;rb&#39;) #打开录制的音频 while True: chunk_data &#61; file_object.read(1600) ws.send(chunk_data, websocket.ABNF.OPCODE_BINARY) #发送 time.sleep(0.05) count &#61; count &#43; 1 if not chunk_data: break print(count) ws.send(&#39;{"end": "true"}&#39;, websocket.ABNF.OPCODE_BINARY)

而后在通信过程中处理接口返回的消息&#xff0c;收集接口返回的识别结果&#xff1a;

def on_message(ws, message): result&#61;json.loads(message) resultmessage&#61; result[&#39;result&#39;] #解析调用接口的返回结果 if resultmessage: resultmessage1 &#61; result[&#39;result&#39;][0] resultmessage2 &#61; resultmessage1["st"][&#39;sentence&#39;] print(resultmessage2) #text_result.insert(tk.END, resultmessage2&#43;&#39;&#39;) result_arr.append(resultmessage2)

最后在通信结束后展示识别结果&#xff1a;

def on_close(ws): print_resule(result_arr) print("### closed ###") def print_resule(arr): text_result.delete(&#39;1.0&#39;,tk.END) for n in arr: text_result.insert("insert", n &#43; &#39;&#39;)

五、总结

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



推荐阅读
  • SpringBoot整合阿里云OSS实现单个图片上传和批量上传
    SpringBoot整合阿里云OSS实现单个图片上传和批量上传 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Iamworkingonaprojectwhichrequiresopentokandcallkitfornotifyingusers.However,theappli ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
author-avatar
用户hxjr5k4y3f
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有