python开发一款翻译工具

张开发
2026/4/20 2:39:24 15 分钟阅读

分享文章

python开发一款翻译工具
最近某水果手机厂在万众期待中开了一场没有发布万众期待的手机产品的发布会发布了除手机外的其他一些产品也包括最新的水果14系统。几天后更新了系统的吃瓜群众经过把玩突然发现新系统里一个超有意思的功能——翻译比如这种奇怪的翻译知识增加了相比常见的翻译工具同声翻译工具更具有实用价值想想不精通其他语言就能和歪果朋友无障碍交流的场景真是一件美事不如自己动手实现个工具备用!一个同声翻译工具逻辑大概可以是先识别而后翻译翻译能否成功识别的准确率是个关键因素。为了降低难度我决定分两次完成工具开发。首先来实现试试语音识别的部分。轻车熟路本次的demo继续调用有道智云API实现实时语音识别。效果展示先看看界面和结果哈可以选择多种语音这里只写了四种常见的偶分别测试的中文、韩文、英文。看着还不错哦~调用API接口的准备工作首先是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例获取调用接口用到的应用的id和密钥。具体个人注册的过程和应用创建过程详见文章分享一次批量文件翻译的开发过程开发过程详细介绍下面介绍具体的代码开发过程。首先是根据实时语音识别文档来分析接口的输入输出。接口设计的目的是对连续音频流的实时识别转换成文本信息并返对应文字流因此通信采用websocket调用过程分为认证、实时通信两阶段。在认证阶段需发送以下参数参数类型必填说明示例appKeyString是已申请的应用IDIDsaltString是UUIDUUIDcurtimeString是时间戳秒TimeStampsignString是加密数字签名。sha256signTypeString是数字签名类型v4langTypeString是语言选择参考支持语言列表zh-CHSformatString是音频格式支持wavwavchannelString是声道支持1单声道1versionString是api版本v1rateString是采样率16000签名sign生成方法如下signTypev4signsha256(应用IDsaltcurtime应用密钥)。认证之后就进入了实时通信阶段发送音频流获取识别结果最后发送结束标志结束通信这里需要注意的是发送的音频最好是16bit位深的单声道、16k采样率的清晰的wav音频文件这里我开发时最开始因为音频录制设备有问题导致音频效果极差接口一直返回错误码304手动捂脸。Demo开发这个demo使用python3开发包括maindow.pyaudioandprocess.pyrecobynetease.py三个文件。界面部分使用python自带的tkinter库来进行语言选择、录音开始、录音停止并识别的操作。audioandprocess.py实现了录音、音频处理的逻辑最后通过recobynetease.py中的方法来调用实时语音识别API。1.界面部分主要元素123456789101112131415161718192021222324roottk.Tk()root.title(netease youdao translation test)frmtk.Frame(root)frm.grid(padx80, pady80)# label1tk.Label(frm,text选择待翻译文件)# label1.grid(row0,column0)labeltk.Label(frm,text选择语言类型)label.grid(row0,column0)comboxttk.Combobox(frm,textvariabletk.StringVar(),width38)combox[value]lang_type_dictcombox.current(0)combox.bind(ComboboxSelected,get_lang_type)combox.grid(row0,column1)btn_start_rectk.Button(frm, text开始录音, commandstart_rec)btn_start_rec.grid(row2, column0)lb_Statustk.Label(frm, textReady, anchorw, fggreen)lb_Status.grid(row2,column1)btn_suretk.Button(frm,text结束并识别,commandget_result)btn_sure.grid(row3,column0)root.mainloop()2.音频录制部分引入pyaudio库需通过pip安装来调用音频设备录制接口要求的wav文件并通过wave库存储文件123456789101112131415161718192021222324252627282930313233343536373839404142def__init__(self, audio_path, language_type,is_recording):self.audio_pathaudio_path,self.audio_file_nameself.language_typelanguage_type,self.languagelanguage_dict[language_type]print(language_dict[language_type])self.is_recordingis_recordingself.audio_chunk_size1600self.audio_channels1self.audio_formatpyaudio.paInt16self.audio_rate16000defrecord_and_save(self):self.is_recordingTrue# self.audio_file_nameself.audio_path/recordtmp.wavself.audio_file_name/recordtmp.wavthreading.Thread(targetself.record,args(self.audio_file_name,)).start()defrecord(self,file_name):print(file_name)ppyaudio.PyAudio()streamp.open(formatself.audio_format,channelsself.audio_channels,rateself.audio_rate,inputTrue,frames_per_bufferself.audio_chunk_size)wfwave.open(file_name,wb)wf.setnchannels(self.audio_channels)wf.setsampwidth(p.get_sample_size(self.audio_format))wf.setframerate(self.audio_rate)# 读取数据写入文件whileself.is_recording:datastream.read(self.audio_chunk_size)wf.writeframes(data)wf.close()stream.stop_stream()stream.close()p.terminate()3.翻译接口调用部分1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465defrecognise(filepath,language_type):globalfile_pathfile_pathfilepathnoncestr(uuid.uuid1())curtimestr(int(time.time()))signStrapp_keynoncecurtimeapp_secretprint(signStr)signencrypt(signStr)uriwss://openapi.youdao.com/stream_asropenapi?appKeyapp_keysaltnoncecurtimecurtime\signsignversionv1channel1formatwavsignTypev4rate16000langTypelanguage_typeprint(uri)start(uri,1600)defencrypt(signStr):hashhashlib.sha256()hash.update(signStr.encode(utf-8))returnhash.hexdigest()defon_message(ws, message):resultjson.loads(message)try:resultmessage1result[result][0]resultmessage2resultmessage1[st][sentence]print(resultmessage2)exceptException as e:print()defon_error(ws, error):print(error)defon_close(ws):print(### closed ###)defon_open(ws):count0file_objectopen(file_path,rb)whileTrue:chunk_datafile_object.read(1600)ws.send(chunk_data, websocket.ABNF.OPCODE_BINARY)time.sleep(0.05)countcount1ifnotchunk_data:breakprint(count)ws.send({\end\: \true\}, websocket.ABNF.OPCODE_BINARY)defstart(uri,step):websocket.enableTrace(True)wswebsocket.WebSocketApp(uri,on_messageon_message,on_erroron_error,on_closeon_close)ws.on_openon_openws.run_forever()总结有道智云提供的接口一如既往的好用这次开发主要的精力全都浪费在了由于我自己录制的音频质量差而识别失败的问题上音频质量ok后识别结果准确无误下一步就是拿去翻译了有了有道智云API实现实时翻译也可以如此简单

更多文章