用Tkinter实现一个离线定时语音播报应用程序

本文介绍了如何使用Python的Tkinter库创建UI,结合pyttsx库实现离线语音播报功能。程序通过读取JSON配置文件设定播报时间,并与系统时间比较,达到定时提醒的目的。在Windows环境下,由于文件编码问题和线程管理的限制,遇到了一些挑战,如文件编码格式、语音播报线程的稳定性以及程序退出时线程的结束。最终通过CoInitialize和CoUninitialize方法解决了线程问题,并用pyinstaller打包成可执行文件。
摘要由CSDN通过智能技术生成

最近单位领导与我提起,说要做一个语音播报功能程序,意在定时提醒职工进行抄表工作。在下也是个刚毕业不久的小白,从头开始学习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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值