返回顶部
分享到

Python实现语音启动电脑应用程序

python 来源:互联网 作者:佚名 发布时间:2025-03-09 08:49:54 人浏览
摘要

实现思路 osk模型进行输入语音转换 txt字典导航程序路径 pyttsx3引擎进行语音打印输出 关键词=程序路径 完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

实现思路

osk模型进行输入语音转换

txt字典导航程序路径

pyttsx3引擎进行语音打印输出

关键词=程序路径

完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

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_dict

  

    with 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_func

    if 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 = None

  

def 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 = callback

        stream = 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 = command

            elif 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_result

    except KeyboardInterrupt:

        say("\n退出程序。")

    finally:

        if stream is not None:

            stream.stop()

            stream.close()

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

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

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

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python操作Word文档7种方法的实现与对比(史上最全
    在Python中操作Word文档是一项常见的任务,特别是在办公自动化和数据处理领域。本文将详细总结和对比几种常用的Python库和方法,包括它们
  • Python实现语音启动电脑应用程序

    Python实现语音启动电脑应用程序
    实现思路 osk模型进行输入语音转换 txt字典导航程序路径 pyttsx3引擎进行语音打印输出 关键词=程序路径 完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  • Python实现高精度敏感词过滤

    Python实现高精度敏感词过滤
    一、需求分析:敏感词过滤的四大核心挑战 准确性要求:误判率需低于0.01% 性能压力:单机QPS需达到10万+ 对抗升级:需识别变体、拼音、谐
  • Python使用Marshmallow轻松实现序列化和反序列化
    可能很多Python开发者都遇到过序列化。你可能会问:花姐,序列化有什么好聊的?这不就是把对象转成字符串、从字符串转回来吗?对啊,
  • Python中从文件路径中提取文件名及扩展名的多种
    1. 使用字符串的 split() 方法提取文件名 问题描述: 给定一个文件路径,如何提取出文件名(包括扩展名)? Python提供了多种方式来处理文
  • Python如何快速下载依赖
    Python快速下载依赖 在 Python 里,若要快速下载依赖,可采用以下几种方法: 1. 使用国内镜像源 Python 依赖通常从 Python Package Index(PyPI)下载
  • 基于Python实现多语言朗读与单词选择测验
    在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音。这样的
  • 使用Python编写测试脚本
    1. 工具库简介 1.1 python-can 定位:通用的 CAN 总线通信库,支持多种硬件接口(SocketCAN、PCAN、Kvaser 等)。 核心功能: 连接物理 CAN 设备或虚
  • 使用Python构建Markdown转Word文档转换器

    使用Python构建Markdown转Word文档转换器
    在当今的文档处理中,Markdown因其简洁的语法和易读性而广受欢迎,而Microsoft Word(DOCX格式)则因其广泛的兼容性和专业的排版效果成为商业
  • 使用Python实现Excel中文转拼音

    使用Python实现Excel中文转拼音
    在日常办公中,我们经常需要处理Excel文件,有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计