python开发一款翻译工具


Posted in Python onOctober 10, 2020

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

python开发一款翻译工具

奇怪的翻译知识增加了!

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

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

效果展示

先看看界面和结果哈:

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

python开发一款翻译工具

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

python开发一款翻译工具

调用API接口的准备工作

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

python开发一款翻译工具

开发过程详细介绍

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

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

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

参数 类型 必填 说明 示例
appKey String 已申请的应用ID ID
salt String UUID UUID
curtime String 时间戳(秒) TimeStamp
sign String 加密数字签名。 sha256
signType String 数字签名类型 v4
langType String 语言选择,参考支持语言列表 zh-CHS
format String 音频格式,支持wav wav
channel String 声道,支持1(单声道) 1
version String api版本 v1
rate String 采样率 16000

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

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

Demo开发:

这个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')
# label1=tk.Label(frm,text="选择待翻译文件:")
# label1.grid(row=0,column=0)
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()

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

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=language_dict[language_type]
 print(language_dict[language_type])
 self.is_recording=is_recording
 self.audio_chunk_size=1600
 self.audio_channels=1
 self.audio_format=pyaudio.paInt16
 self.audio_rate=16000

def record_and_save(self):
 self.is_recording = True
 # self.audio_file_name=self.audio_path+'/recordtmp.wav'
 self.audio_file_name='/recordtmp.wav'

 threading.Thread(target=self.record,args=(self.audio_file_name,)).start()

def record(self,file_name):
 print(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.翻译接口调用部分:

def recognise(filepath,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 + "&salt=" + nonce + "&curtime=" + curtime + \
  "&sign=" + sign + "&version=v1&channel=1&format=wav&signType=v4&rate=16000&langType=" + language_type
 print(uri)
 start(uri, 1600)


def encrypt(signStr):
 hash = hashlib.sha256()
 hash.update(signStr.encode('utf-8'))
 return hash.hexdigest()



def on_message(ws, message):
 result=json.loads(message)
 try:
 resultmessage1 = result['result'][0]
 resultmessage2 = resultmessage1["st"]['sentence']
 print(resultmessage2)
 except Exception as e:
 print('')

def on_error(ws, error):
 print(error)


def on_close(ws):
 print("### closed ###")


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 start(uri,step):

 websocket.enableTrace(True)

 ws = websocket.WebSocketApp(uri,
    on_message=on_message,
    on_error=on_error,
    on_close=on_close)

 ws.on_open = on_open
 ws.run_forever()

总结

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

以上就是python开发一款翻译工具的详细内容,更多关于python开发翻译工具的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python应用程序在windows下不出现cmd窗口的办法
May 29 Python
python文件和目录操作函数小结
Jul 11 Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
python 实现目录复制的三种小结
Dec 04 Python
Python实现点云投影到平面显示
Jan 18 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
浅谈python锁与死锁问题
Aug 14 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
实例详解Python的进程,线程和协程
Mar 13 Python
Python pickle模块常用方法代码实例
Oct 10 #Python
Python3.9新特性详解
Oct 10 #Python
Python random模块的使用示例
Oct 10 #Python
python 装饰器的使用示例
Oct 10 #Python
python使用bs4爬取boss直聘静态页面
Oct 10 #Python
通过案例解析python鸭子类型相关原理
Oct 10 #Python
通过实例解析python subprocess模块原理及用法
Oct 10 #Python
You might like
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
python实现哈希表
2014/02/07 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
采购部岗位职责
2013/11/24 职场文书
销售实习自我鉴定
2013/12/07 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
公益活动邀请函
2014/02/05 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
行政二审代理词
2015/05/25 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
一条 SQL 语句执行过程
2022/03/17 MySQL