基于python语音启动电脑应用程序

devtools/2024/12/26 14:21:23/
 

osk模型进行输入语音转换
txt字典导航程序路径
pyttsx3引擎进行语音打印输出

关键词=程序路径

import os
import json
import queue
import sounddevice as sd
from vosk import Model, KaldiRecognizer
import subprocess
import time
import pyttsx3
import threading# 初始化 pyttsx3 引擎
engine = pyttsx3.init()
engine.setProperty('rate', 150)    # 设置语速
engine.setProperty('volume', 1.0)  # 设置音量# 加载Vosk模型
model_path = r"D:\daku\yuyinshibie\vosk-model-small-cn-0.22"
if not os.path.exists(model_path):print(f"模型路径不存在: {model_path}")engine.say(f"模型路径不存在: {model_path}")engine.runAndWait()exit(1)# 读取字典文件,格式为 "命令=程序路径"
def load_app_dict(file_path):app_dict = {}if not os.path.exists(file_path):print(f"字典文件不存在: {file_path}")engine.say(f"字典文件不存在: {file_path}")engine.runAndWait()return app_dictwith open(file_path, 'r', encoding='utf-8') as file:for line in file:parts = line.strip().split('=')if len(parts) == 2:keys, value = parts# 处理可能存在的别名情况,例如 "微信,weixin"for key in keys.split(','):app_dict[key.strip()] = value.strip()return app_dict# 启动应用程序
def launch_application(app_name, app_dict):if app_name in app_dict:app_path = app_dict[app_name]response = f"正在启动 {app_name}..."say(response)subprocess.Popen(app_path)time.sleep(2)  # 等待2秒再继续监听else:response = f"找不到与 '{app_name}' 对应的应用程序。"say(response)# 定义一个函数用于语音输出,并在说的时候暂停监听
def say(text):global stream, callback_funcif stream is not None:with stream_lock:stream.callback = None  # 移除回调函数以暂停监听stream.stop()           # 暂停音频流engine.say(text)engine.runAndWait()if stream is not None:with stream_lock:stream.start()          # 恢复音频流stream.callback = callback_func  # 重新设置回调函数# 初始化模型和识别器
model = Model(model_path)
rec = KaldiRecognizer(model, 16000)q = queue.Queue()last_partial_result = ""
last_full_command = ""stream_lock = threading.Lock()
stream = None
callback_func = Nonedef callback(indata, frames, time, status):if status:print(status, file=sys.stderr)q.put(bytes(indata))# 主程序
if __name__ == "__main__":dict_file = r"D:\daku\yuyinshibie\zidian.txt"  # 字典文件路径app_dict = load_app_dict(dict_file)try:# 提前初始化音频流callback_func = callbackstream = sd.RawInputStream(samplerate=16000, blocksize=8000, dtype='int16',channels=1, callback=callback)stream.start()say("请说:")while True:data = q.get()if rec.AcceptWaveform(data):result = json.loads(rec.Result())command = result['text'].strip()if command and command != last_full_command:print(f"你说的是: {command}")say(f"你说的是: {command}")if "打开" in command:app_to_open = command.replace("打开", "").strip()launch_application(app_to_open, app_dict)last_full_command = commandelif rec.PartialResult():partial_result = json.loads(rec.PartialResult())['partial']if partial_result and "打开" in partial_result and partial_result != last_partial_result:print(f"部分结果: {partial_result}")say(f"部分结果: {partial_result}")last_partial_result = partial_resultexcept KeyboardInterrupt:say("\n退出程序。")finally:if stream is not None:stream.stop()stream.close()

关键词部分,为了识别准确以及出现谐音内容可以增添多个关键词使用,作为分割

字典路径如果出现中文字符有可能会报错!

代码意义不大,如果考虑深入:可以尝试增加快捷键,以及相关应用接口可以更好控制

上班族打开电脑i第一件事情是启动相关应用,同样可以尝试多应用编组启动


http://www.ppmy.cn/devtools/145545.html

相关文章

【YashanDB知识库】XMLAGG方法的兼容

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802943.html?templateId1718516 【关键字】 XMLAGG方法的兼容 【问题描述】 崖山数据库不支持将XMLAGG相关的函数内容,需要替换成支持的功能函数WM_CONCAT(T.COLUMN_NAME…

nlohmann的常用用法

3.9之后新增了 2个宏 可以实现 结构体和json的快速转换 1.结构体序列化json 1.1 3.9 #include <iostream> #include <string> #include <vector> #include "json.hpp"// 定义用户结构体 struct User {std::string name; // 用…

YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM

如何在增强特征图的同时降低计算成本&#xff0c;以提升模型性能。基于此&#xff0c;MSCAM 模块采用了多尺度卷积注意力机制&#xff0c;通过 CAB、SAB 和 MSCB 三个子模块协同工作。CAB 利用自适应池化和卷积操作生成通道注意力权重&#xff0c;强调重要通道特征&#xff1b;…

修改输出资源的名称和路径、自动清空上次打包资源

一、修改输出资源的名称和路径 1.1 配置 const path require("path");module.exports {// 入口【相对路径】entry: ./src/main.js,// 输出output: {// 文件的输出路径【绝对路径】// __dirname 当前文件的文件夹的绝对路径path: path.resolve(__dirname, dist),/…

Android 之 List 简述

一、简单创建方式 Android 开发中&#xff0c;列表有很多种类&#xff0c;如ArrayList、LinkedList、List、MutableList等&#xff0c;创建列表的方式如下所示&#xff1a; fun listDemo() {// 使用 listOf 创建不可变的空列表val list listOf<Int>()val list1 listOf…

常用的消息中间件都有哪些

在Java编程领域&#xff0c;消息中间件扮演着举足轻重的角色&#xff0c;它们为分布式系统提供了高效、可靠的异步通信机制。 1. RabbitMQ&#xff1a; • 这是一个源自AMQP&#xff08;高级消息队列协议&#xff09;的消息中间件。 • 它提供了丰富的消息路由、过滤和持久化功…

安卓project级别build.gradle和主module的build.gradle

以穿山甲为例讲解 如下图 gradle和gradle插件对应关系 Android Gradle 插件 8.7 版本说明 | Android Studio | Android Developers gradle对应在项目里的配置为 gradle插件对应的位置为

Docker怎么关闭容器开机自启,批量好几个容器一起操作?

环境&#xff1a; WSL2 docker v25 问题描述&#xff1a; Docker怎么关闭容器开机自启&#xff0c;批量好几个容器一起操作&#xff1f; 解决方案&#xff1a; 在 Docker 中&#xff0c;您可以使用多种方法来关闭容器并配置它们是否在系统启动时自动启动。以下是具体步骤和…