原文链接:http://www.juzicode.com/archives/4635
周末在楼下超市买菜的时候,结完账超市老板田大爷把桔子菌拉到一边神秘兮兮地说:听说你是写程序的?
桔子菌茫然地点点头:是的,写过一点的。
田大爷朝隔壁竞争对手望了望,压低声音跟桔子菌说:听到没,我也想搞一个那样的软件给我播报菜价,但是打听了下,100块只能用3个月。
桔子菌听着隔壁超市传来明显的”机器”腔调声,那是超市惯用的语言播报软件发出来的,只是不知道这种软件的使用还有这么个讲究。
田大爷继续说了:你是写程序的,能不能帮忙找一个这样的免费软件。电脑和音箱我这里已经有了,不用你操心。
哦,对了,这种软件的使用越简单越好。田大爷赶紧补充了一条需求。
看来在别人眼里程序猿的刻板印象还是相当刻骨铭心的,只要是和电脑相关的工作都是程序猿能干的,上次桔子菌确实也给田大爷修过电脑的,不过这次找软件好像和写代码有点接近些了。
桔子菌看了看超市里那个人工录音的大喇叭,还没有开口。
田大爷摆出很嫌弃的样子:这不好用啊,几十个菜价只要有一个发生了变化,又要把所有的菜价全部重新录一遍。田大爷是摇着头说完的。
看着田大爷殷切的眼神,桔子菌不忍心残忍拒绝,但是也不确定能不能找到这种软件,只是答应了田大爷试试看。
没想到平时桔子菌在田大爷这里做了这么多次甲方,今天田大爷成了桔子菌的“甲方”。
回到家桔子菌吃完午饭就来到了电脑前,开始给田大爷物色免费软件。
桔子菌首先搜到的是下面这种,在网页上写一段文字,对方把语音文件录好发回来,但是价格也不菲,而且和大爷说的需求也不符,菜价发生变化又得重新交钱,重新录制。
桔子菌又跑到软件分享网站上找到几个离线版的,表面说免费使用,实际上仍然是要收费的:
而且看着操作起来似乎也不简单:
田大爷的需求很明确:免费、简单、适应价格变化,可是桔子菌在网上找了个把小时愣是没有物色到符合需求的软件。就在将要放弃之际桔子菌心想既然找不到现成的,为何不自己做一个呢?
桔子菌快速做了评估,自己做的话其他都好说,难点是怎么将文字转换为语音这部分。我们知道Windows系统从XP开始就有“文字转语音TTS”的功能,到了win7和win10系统就演变成了“讲述人”:
Windows自带的这些功能,一般也会提供类似的编程接口。这个时候桔子菌首先想到的当然是怎么用Python做了,一种方式是写VBS脚本交给Python调用,另外还可以通过win32com模块加载文字转语音组件,后者更原汁原味,就选win32com了。
先写个简单的脚本测试下:
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
speaker.Speak("桔子 3块钱一斤")
运行之后听了下,效果还可以,也是原汁原味的“机器”声音。
接下来就是怎么具体实现了,为了快速部署“上线”,桔子菌并不打算做复杂的操作界面,如果要修改价格、增加菜品,直接在excel里面修改。
但是想到要修改excel表格,桔子菌担心田大爷不会操作。问过田大爷后,来了个大反转,这次轮到桔子菌对田大爷有刻板印象了,他表示修改excel完全没有问题,啧啧啧。
有了前面的“顶层设计“,接下里就是实现”底层逻辑“了。用Tk做界面,一个开始按钮,一个停止按钮,加一个显示状态的文本框。因为要循环播报,不能在Tk的按钮事件里面加无限循环,所以需要开个线程。按钮只改变一个标志位即可,线程里面每次轮询这个标志位决定开始播报还是停止播报。价格手动在excel里修改,用Python的xlrd模块读出数据。最后就是用pyinstaller打包程序。
表格结构是这样的,三列,如果单位不填写默认解析为斤:
做出来的效果就是这样的:
最后当然就是部署“生产环境”了,程序发布给田大爷使用。
田大爷反馈这个软件用起来确实容易上手,现在终于可以和隔壁对手一起同台竞技飚菜价了。
哦,对了,田大爷表示下次有机还会再找桔子菌修电脑、找软件。