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 break语句详解
Mar 11 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
Python检测生僻字的实现方法
Oct 23 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
在macOS上搭建python环境的实现方法
Aug 13 Python
python中count函数简单的实例讲解
Feb 06 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Selenium 滚动页面至元素可见的方法
Mar 18 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
php str_pad 函数用法简介
2009/07/11 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
python之Character string(实例讲解)
2017/09/25 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
大学校园毕业自我鉴定
2014/01/15 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
档案保密承诺书
2014/06/03 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
项目转让协议书
2014/10/27 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
找规律教学反思
2016/02/23 职场文书
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python