最近单位领导与我提起,说要做一个语音播报功能程序,意在定时提醒职工进行抄表工作。在下也是个刚毕业不久的小白,从头开始学习Python,对于这个程序虽说小,但也只是看起来而已,在细节方面还是查阅了很多的资料,毕竟新手上路,踩了不少坑。在此记录一下,以便于以后如果忘记了可以回来看看。
最初的设想呢,是使用Tkinter来做UI,pyttsx来做语音播报,因为没经费,值班室的电脑又是局域网不能连外网,只能调用电脑自带的声卡来播放,而不能考虑百度云等开放语音平台,所以决定用pyttsx库。又想到时间设置的问题,电脑上有别的软件在使用数据库,不允许私自动,在这个方面决定使用json文件做为时间配置文件。
话不多说,直接上代码。
配置文件
以json为配置文件。形式为“第xx次抄表”:“xx:xx” 值为时间,不规定日期,因为每天都要,只固定每天抄表时间。
import json
def getData():
with open("config.json",encoding='utf-8-sig') as json_file:
config = json.load(json_file)
return config
导入json包后,通过load方法读取json文件,返回的config变量是一个dict类型的变量。在此注意,在windows系统下,要以utf-8-sig的解码形式打开文件,在其他系统不知道怎样。反正windows以记事本编辑任何文本文件保存后,都会变成BOM形式(就是其中有三个进制码,让操作系统识别这个用记事本编辑过)的文件,用其他文本编辑器倒不会出现这个问题。这个问题会直接导致你用记事本来修改完配置文件后程序无法识别其中的内容。这是第一个坑!
语音播报
配置文件弄好了,接下来就是试试能否播放文本内容。
import pyttsx3
import datetime
def saudi():
curr_time = datetime.datetime.now()
engine = pyttsx3.init()
msg = '现在是,' + str(curr_time.year) + '年' + str(curr_time.month) + '月' + str(curr_time.day) + '日' + str(
curr_time.hour) + '点' + str(curr_time.minute) + '分'+str(curr_time.second)+',抄表时间到'
rate = engine.getProperty('rate')
engine.setProperty('rate', rate - 50)
volume = engine.getProperty('volume')
engine.setProperty('volume', volume + 0.25)
engine.say(msg)
engine.runAndWait()
这个是pyttsx的固定代码形式了。倒是挺顺利的,导入所需的包,init()方法初始化。这里是以获取当前系统时间,提醒抄表的固定播报形式,用getproperty来获取属性,setproperty来设置属性,其中rate为语速,volume为音量,都可在方法内调整大小。最后用say方法存入要说的字符串或文本,用runAndWait()方法来启动语音播报。可以说是最顺利的环节,基本无坑,形式固定。
时间处理
既然上面说了,json文件拿出来的数据是dict类的,形式也要转换成时间格式,即要对json文件中的时间数据做格式化处理。同时要与当前时间做比对,如果时和分对得上,就进行播报。python中好像没有直接将dict转换为datatime的,所以只能自己写了。
import json
import datetime
import dateutil.parser