热门标签 | 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;实现实时翻译也可以如此简单



推荐阅读
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 在MySQL中实现时间比较功能的详细解析与应用
    在MySQL中实现时间比较功能的详细解析与应用。本文深入探讨了MySQL中时间比较的实现方法,重点介绍了`UNIX_TIMESTAMP`函数的应用。该函数可以接收一个日期时间参数,也可以不带参数使用,其返回值为Unix时间戳,便于进行时间的精确比较和计算。此外,文章还涵盖了其他相关的时间处理函数和技巧,帮助读者更好地理解和掌握MySQL中的时间操作。 ... [详细]
  • 探讨 jBPM 数据库表结构设计的精要与实践
    探讨 jBPM 数据库表结构设计的精要与实践 ... [详细]
  • 如何在微信公众平台集成新浪云服务应用摘要:新浪云服务平台SinaAppEngine(简称SAE)自2009年启动内部研发,并于同年对外开放。本文详细介绍了如何利用SAE的强大功能,在微信公众平台上构建高效、稳定的云服务应用程序,涵盖从环境配置到应用部署的全流程,为开发者提供详尽的技术指导与实践案例。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
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社区 版权所有