如何用python写小工具_用python写一个录音小工具
Python的paramiko,wxPython库的应用
Sound eXchange 命令行
需求
最近在给一个做语音识别的项目做QA工作。众所周知,此类人工智能方面的项目都需要一些数据收集的工作。作为一个比较小型的团队,暂时还没有使用外包团队来做大量的数据,前期数据来源都是团队内的同事录音。
我们的录音工具是树莓派+麦克风阵列,通过ssh,可以用电脑操作树莓派开始录音和停止录音。虽然从QA的角度来说,操作非常固定,但是团队同事有近一半同事不是程序猿,看到secureCRT这么恐怖的界面(此处应有图)大多还是有心理障碍。
所以为了提升用户体验(其实是没有工具就得我一个人来录了),用python做了个简单的工具,达到了点点就能用效果。顺带还整合了两三波新的需求
基本功能
可以从语料库中随机出一句话,展示在界面上给朗读人看
可以点击按钮开始录音,点击按钮结束录音。留了一个取消录音功能防止嘴飘。
有一些环境参数(性别,安静环境/嘈杂环境,距离等)可以手动填入
结束录音后可以按照格式保存为xxxx.wav文件
升级功能
支持播放已有语音的功能,用于做环境噪音合成
原理
麦克风阵列通过USB连接到树莓派,树莓派通过无线连接到插在电脑上的360随身wifi上。PC通过secureCRT或者mac的ssh语句可以远程到树莓派上执行指令。
连上以后执行下述命令即可开始录音。
$arecord -D "plughw:1,0" -r 16000 -c 10 -f S16_LE test.wav
录音指令是阻塞的,ctrl+C停止录音。
Version.1 Flask + paramiko
第一个版本就是基于上述原理的。而且因为要做个界面,所以就选了比较熟悉的Bootstrap做网页,Flask做后端,通过paramiko来执行操作。
paramiko
连接
paramiko创建ssh连接的方式如下:
import paramiko
IP = "xxx.xxx.xxx.xxx"
PORT = 22
USERNAME = "user"
PASSWORD = "pwd"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(IP, PORT, USERNAME, PASSWORD)
执行指令
paramiko中执行指令的类有2个,一个是上述代码中的ssh,可以用stdin, stdout, stderr = ssh.exec_command(cmd)来执行cmd指令,还有一个是可以用channel来执行。
chan = ssh.get_Transport().open_session()
chan = send(cmd)
str = chan.recv(recv_buffer)
考虑到上述录音指令是阻塞的,因此如果采用ssh.exec_command(cmd)没有办法通过ctrl+C来停止录音。因此考虑采用channel.send的方法。ctrl+C可以用channel.send('\x03')来执行。
但是各种花式调用以后,一直都没能停掉录音的进程,原因不明。
因此尝试了一下直接kill掉进程可以保存数据以后,选择了简单粗暴地kill掉arecord所在进程的方法。那么接下来的问题就是获取arecord所在进程id的方法了。
执行$ps -ef | grep \"arecord\" | grep -v grep | awk '{print $2}'可以获取到arecord所在进程pid,再拼接指令$kill -9 xxxx即可杀掉进程。
前端
前端其实没啥好说,提交表单,ajax刷新页面。不过之前其实也没有写过ajax的get方法,所以记录一下
function randomclick(){
$.get("/random", function(data){document.getElementById('scentence').innerHTML = data;})
};
整体框架
解决了上述执行指令的问题以后,基本就是给网页提供接口了。除了随机语句的功能以外,就是
开始录音:执行录音语句
结束录音:结束录音进程,并将语音文件重命名为指定格式的wav文件
取消录音:结束录音进程,删除临时语音文件
Version.2 wxPython+sox
后来因为有了新的需求,主要是播放wav文件和文件命名优化。回过头来看了看,觉得这种需求做成网页其实是不大合适的,毕竟根本没法处理并发的情况。所以决定用python的UI库来做成一个小工具。
之前用过python的pyqt库,但是不知道为什么安装不上pyqt(我觉得就是那阵特别不顺,没别的!),于是换成了wxPython。后来发现wxPython的media还自带音频播放功能。
wxPython
UI设计
大概描述一下需求吧
文本展示框,附带2个功能按钮,只改变该文本框的内容
退出时保存一些运行信息到文件中
几个信息输入框,可能有select,也有可能有文本输入
开始录音、结束录音和取消录音按钮
选择播放录音目录的按钮和播放录音的按钮
接下来就一个一个需求点来说吧
文本展示框
sentence = wx.TextCtrl(self, style = wx.TE_MULTILINE, size = (xx, xx))
sentence.SetValue(str)
str = sentence.GetValue()
style = wx.TE_MULTILINE表示该文本框为多行文本框,会自动换行。默认为单行文本框。可以用SetValue方法设置其值,也可以用GetValue来读取文本框的值。
退出时保存信息
def __init__(self, parent, title)
self.Bind(wx.EVT_CLOSE, self.onExit, parent)
def onExit(self, evt):
# do sth
evt.Skip()
pass
在init函数中通过self.Bind将wx.EVT_CLOSE事件绑定到self.onExit函数上。
在self.onExit函数中将运行时的参数保存于文档中。
注意最后需要evt.Skip()来执行关闭界面的功能
特别需要注意的是,当前类需要继承wx.Frame才能使得关闭界面与当前类的wx.EVT_CLOSE事件绑定。
选择框
category_list = ["男", "女"]
classify = wx.Choice(self, -1, choices=category_list, size = (100, 48))
classify.SetSelection(0)
wx.Choice组件需要提供下拉选择列表,比如category_list,可以用SetSelection(idx)将列表中的idx项设为默认值。如果没有设定默认值,默认显示为空。
目录选择按钮
def onClickSelectDir(self, evt):
dlg = wx.DirDialog(self, "Choose a directory:")
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
self.updatelist(path)
dlg.Destroy()
将目录选择按钮的wx.EVT_BUTTON绑定至onClickSelectDir函数上。通过path = dlg.GetPath()获取到选择的目录以后,执行自定义的updatelist(path)来完成保存数据的功能。
播放功能
def __init__(self, parent, title):
try:
self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
except NotImplementedError:
self.Destroy()
raise
self.Bind(EVT_BUTTON, onPlay, playbutton)
def onPlay(self, evt):
self.mc.Load(self.filename)
time.sleep(0.5)
self.mc.Play()
在init中定义MediaCtrl控件
把playbutton的点击事件和onPlay函数绑定
onPlay函数中,首先用MediaCtrl组件的Load函数加载媒体文件,sleep(0.5)后执行Play函数。
其实这种写法并不是非常专业,之前调研的结果是需要处理EVT_MEDIA_LOADED事件,但是尝试发现将此事件与函数绑定后并未触发该事件,因此简单粗暴sleep解决。
如何用python写小工具_用python写一个录音小工具相关推荐
- python版本管理工具_使用 Python 官方工具在 windows 上管理 Python 多版本
0. 使用官方工具 网上很多教程还在用修改Python.exe文件名的方式来进行多版本的管理,其实Python官方在3.3已经有了一个官方的工具,使用起来也很方便. 1. 下载 2.x 和 3.x(3 ...
- python小工具小发明_【kimol君的无聊小发明】—用python写截屏小工具
前言 今天我看了一下自己的文件夹,发现了自己写了许多似乎很无聊的代码.于是乎,一个想法油然而生:"生活已经很无聊了,不如再无聊一点叭". 说干就干,那就开一个专题,我们称之为kim ...
- 可以用python实现一些小发明_【kimol君的无聊小发明】—用python写图片格式批量处理工具...
前言某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码.我拍腿正坐,一个想法油然而生:"生活已然很无聊,不如再无聊些叭" ...
- python批量裁剪图片_用Python写了一个图片格式批量处理工具
来源:blog.csdn.net/kimol_justdo 前言 就在昨天,正当我在刺激战场厮杀时,"叮叮叮",微信来消息了.我心想:"这是肾马情况?" 我打开 ...
- python写cdr插件_使用CorelDraw的19个小技巧
使用CorelDraw的19个小技巧 (2010-11-02 01:53:13) 标签: it 1.保证平滑的渐变 你在CorelDRAW 8中创造渐变时,获得平滑的中间形状的最好方法是以渐变控制物件 ...
- iospython开发工具_使用Python开发iOS程序
们见过使用JS.Lua.Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回答. 那么,怎么用Python开发iOS程序呢?其实我们 ...
- python 代码行数统计工具_使用Python设计一个代码统计工具
问题 设计一个程序,用于统计一个项目中的代码行数,包括文件个数,代码行数,注释行数,空行行数.尽量设计灵活一点可以通过输入不同参数来统计不同语言的项目,例如: # type用于指定文件类型 pytho ...
- python编程小知识_分享Python开发中要注意的十个小贴士
大家请注意:这篇文中假设我们都用的是Python 3 1. 列表推导式 你有一个list:bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子:[2, 4, 6, ...
- python英语词汇读音_利用Python制作查单词小程序(一):抓取来自百度翻译的单词释义和音标...
小编在学习英语的时候,遇到不认识的英语单词,会用百度翻译来查询单词的释义和音标,并播放单词的读音.为了便于复习和记忆,需要将单词的释义和音标以复制粘贴的方式保存到本地. 这个过程非常繁琐,于是小编就想 ...
- python 网页版笔记_【Python笔记】Python网页正文抽取工具
本文信息本文由方法SEO顾问发表于2016-05-2018:48:27,共 1153 字,转载请注明:[Python笔记]Python网页正文抽取工具_[方法SEO顾问],如果我网站的文章对你有所帮助 ...
最新文章
- Oracle ASM 翻译系列第二十七弹:ASM INTERNAL ASM METADATA BLOCK
- onsrcoll和scrollTop兼容与实现
- 阿里云ECS上LVM磁盘配置
- 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)
- 第二次作业--熟悉使用工具
- go设置后端启动_为什么 Rubyists 应该考虑学习 Go
- Kafka核心源码解析 - KafkaController源码解析
- Java-占位符的使用
- Atitit. 类与对象的存储实现
- 猫扑_猫女郎图片批量下载器
- 018-双因素理论|如何管理80后,90后
- ESP8266+电能计量芯片
- 如何使用OpenCV的处理图像,文字变得锐利和清晰?(How to use OpenCV to process image so that the text become sharp and clea
- java基础初解一:数据类型、String、运算
- 小程序中实现关注公众号
- ConcurrentModificationException 并发修改异常剖析及解决方案
- c语言读文件编译,C语言读取wav文件的问题,请大侠,编译问题。
- 1377:最优乘车(travel)
- 海康威视网络摄像头开发流程(四)-------- 下载萤石云js插件
- 基于DSP的数字图像处理(1)