语音识别控制(软件、硬件)

news2024/12/23 2:35:39

1. 环境

python版本:3.11.9

2. 完整代码

import sqlite3
import time
import wave  # 使用wave库可读、写wav类型的音频文件
from funasr import AutoModel
import sounddevice as sd
import numpy as np
from modelscope import pipeline, Tasks
from pypinyin import lazy_pinyin
import pyaudio  # 使用pyaudio库可以进行录音,播放,生成wav文件
# 模型参数设置
chunk_size = [0, 10, 5]
encoder_chunk_look_back = 7
decoder_chunk_look_back = 5
is_task_running= True
model = AutoModel(model="D:\SpeechRecognize\speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch")

# 假设模型要求的采样率为 16000
fs = 16000
duration = 3 #时间
chunk_stride = chunk_size[1] * 960
cache = {}
window_size = 3

# 连接到 SQLite 数据库,如果不存在则会创建新的数据库文件
conn = sqlite3.connect('speech_recognition.db')
cursor = conn.cursor()

# 创建表格
cursor.execute('''
    CREATE TABLE IF NOT EXISTS speech_data
    (text TEXT, time_stamp TEXT, batch TEXT)
''')

def record(time):  # 录音程序
    # 定义数据流块
    CHUNK = 1024  # 音频帧率(也就是每次读取的数据是多少,默认1024FORMAT = pyaudio.paInt16  # 采样时生成wav文件正常格式
    CHANNELS = 1  # 音轨数(每条音轨定义了该条音轨的属性,如音轨的音色、音色库、通道数、输入/输出端口、音量等。可以多个音轨,不唯一)
    RATE = 16000  # 采样率(即每秒采样多少数据)
    RECORD_SECONDS = time  # 录音时间
    WAVE_OUTPUT_FILENAME = "./output.wav"  # 保存音频路径
    p = pyaudio.PyAudio()  # 创建PyAudio对象
    stream = p.open(format=FORMAT,  # 采样生成wav文件的正常格式
                    channels=CHANNELS,  # 音轨数
                    rate=RATE,  # 采样率
                    input=True,  # Ture代表这是一条输入流,False代表这不是输入流
                    frames_per_buffer=CHUNK)  # 每个缓冲多少帧
    print("* 开始录音")  # 开始录音标志
    frames = []  # 定义frames为一个空列表
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):  # 计算要读多少次,每秒的采样率/每次读多少数据*录音时间=需要读多少次
        data = stream.read(CHUNK)  # 每次读chunk个数据
        frames.append(data)  # 将读出的数据保存到列表中
    print("* 结束语音")  # 结束录音标志
    stream.stop_stream()  # 停止输入流
    stream.close()  # 关闭输入流
    p.terminate()  # 终止pyaudio
    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')  # 以'wb‘二进制流写的方式打开一个文件
    wf.setnchannels(CHANNELS)  # 设置音轨数
    wf.setsampwidth(p.get_sample_size(FORMAT))  # 设置采样点数据的格式,和FOMART保持一致
    wf.setframerate(RATE)  # 设置采样率与RATE要一致
    wf.writeframes(b''.join(frames))  # 将声音数据写入文件
    wf.close()  # 数据流保存完,关闭文件
    while is_task_running:
    start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    myrecording = sd.rec(int(fs * duration), samplerate=fs, channels=1)
    sd.wait()
    speech_chunk = myrecording.flatten()
    # 噪声处理
    filtered_chunk = np.convolve(speech_chunk, np.ones(window_size) / window_size, mode='same')
    speech_chunk = filtered_chunk
    is_final = False
    res = model.generate(input=speech_chunk, cache=cache, is_final=is_final, chunk_size=chunk_size,
                         encoder_chunk_look_back=encoder_chunk_look_back,
                         decoder_chunk_look_back=decoder_chunk_look_back)
    text_result=''.join(lazy_pinyin(str(res[0]['text']))).replace(" ", "")
    # 唤醒词
    s1=''.join(lazy_pinyin(str("小爱")))
    if s1 in text_result:
        #关闭循环
        is_task_running ==False
        print("已唤醒,开始录音")
        record(5)  # 定义录音时间,单位/s
        inference_pipeline = pipeline(
            task=Tasks.auto_speech_recognition,
            model='D:/SpeechRecognize/speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
            model_revision="v2.0.4")
        rec_result = inference_pipeline('./output.wav', hotword='')
        same = ''.join(lazy_pinyin(rec_result[0]["text"].replace(" ", "")))
        print("语音转文字" + same)
        #匹配字符关键词
        #关键词1 、、、、
        g1 = ''.join(lazy_pinyin(str("打开空调")))
        if g1 in same:
            #通讯发送消息,我会提供五种硬件通讯方式 MTTTSocketModBusTcpIP、串口、HTTP请求
            print("发送给设备")
        is_task_running == True
    cursor.execute("INSERT INTO speech_data (text, time_stamp, batch) VALUES (?,?,?)",
                   (text_result, start_time, 'eerr'))
    conn.commit()

3. 硬件通讯

很多人搞不懂,如何用软件控制硬件,但是实际上没大家想的那么复杂,一般的硬件都会提供接口,只要找到厂家要他的通讯方式和通讯内容,就可以实现用软件控制硬件

3.1ModbusTCPIP

比较通用的工业通讯协议,读写PLC数据

from pymodbus.client import ModbusTcpClient
def read_data(ip, port, postion):
    # 创建 Modbus TCP 客户端并连接
    client = ModbusTcpClient(ip, port=port)  # 请替换为实际的设备 IP 和端口
    client.connect()
    try:
        # 读取保持寄存器
        num = 0
        result = client.read_holding_registers(postion, 1)
        for value in result.registers:
            print(value)
            num = value
    except Exception as e:
        print("Exception:", e)
    finally:
        # 关闭连接
        client.close()
    return str(num)


def send_data(ip, port, postion, num):
    client = ModbusTcpClient(ip, port=port)
    client.connect()

    try:
        # 发送数据到保持寄存器
        write_result = client.write_registers(postion, [num])  # 从地址 20 开始写入数据
        if not write_result.isError():
            print("Write Success")
        else:
            print("Write Error:", write_result)

    except Exception as e:
        print("Exception:", e)

    finally:
        client.close()
    return 2

3.2MQTT

最近比较流行的工业协议
读取消息

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("your_topic")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("broker_ip_address", 1883, 60)

client.loop_forever()

写入消息

import paho.mqtt.publish as publish

publish.single("your_topic", "your_message", hostname="broker_ip_address", port=1883)

3.3 Socket TCPIP

def socketddd(ip, port, code):

    # 要发送的内容
    content = str(code)+'\a\r\n'
    # 创建套接字
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 连接服务器
    server_address = (str(ip), int(port))
    s.connect(server_address)

    # 发送数据
    s.sendall(content.encode())

    # 关闭连接
    s.close()

3.4 串口

比较基础的串口

def task1():
    serials = serial.Serial('COM5', 9600, timeout=0.5)
    while is_task_running1:
        if serials.isOpen():
            print("open success")
            send_data_hex = bytes.fromhex('5A 06 00 00 60\r\n')
            serials.write(send_data_hex)  # 编码
        else:
            print("open failed")
        time.sleep(1)  # 每隔 5 秒执行一次

4. 效果

在这里插入图片描述

5.问题

1.必须有麦克风才能跑起来
2.关于模型包,可以直接从模型社区下载(也可私信我)
3.最后的效果与你电脑的显卡有直接联系
4.关于唤醒后定时录音,实际上可以通过计算音频波形判断是否有音频输入,一般2秒没有音频就默认结束录音
5.关于通讯,实际上本质就是报文,在局域网和公网只要连接上即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件著作权登记所需要的材料

软件著作权登记所需材料全面解析 在当今数字化时代,软件著作权作为保护软件开发者智力劳动成果的重要法律手段,其登记过程显得尤为重要。 一、软件著作权登记申请表 首先,软件著作权登记需要提交的最基本材料是《软件著作权登记申请表》。这份…

深度优先搜索算法及其matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记################# 深度优先搜索算法(DepthFirst Search),简记DFS算法,是图论中的首要算法,其思想方法渗透到图论中的许多算法之中,尤其是DFS算法在求生成树、割点、块和平面图嵌入算法中起着极为关键的作用。…

写文档-画UML图-编程的秘密武器:Kimi智能助手

在快速发展的软件开发领域,如何高效地编写需求分析文档、软件设计文档以及代码,成为每位程序员和架构师面临的重要挑战。今天,我要向大家介绍一款强大的工具——Kimi智能助手,它将帮助你提升工作效率,优化开发流程。 …

【图灵完备 Turing Complete】游戏经验攻略分享 Part.5 编程

编程部分的话,第一关会让你输入机器码,这一章节还是比较简单的,因为操作码是固定给出的,只需要根据题意去编写,完成这章目的是为了解锁下面的关卡。 输入,移动COPY之后进行运算,然后输出。 激光…

18937 阿克曼(Ackmann)函数

### 思路 1. **递归定义**:根据阿克曼函数的定义,使用递归来计算函数值。 2. **递归终止条件**: - 当 m 0 时,返回 n 1�� - 当 m > 0 且 n 0 时,返回 ackermann(m - 1, 1)。 - 当…

基于单片机的粮仓环境检测系统设计

本设计主要由处理模块、温湿度检测模块、数据显示模块、声光报警模块和按钮的输入模块组成。采用了AT89C52作为主要的控制单元,利用DHT11温湿度传感器,对粮食仓库中的温度和湿度等展开检测,并在LCD1602液晶显示器中进行实时显示。同时&#x…

C++之GradeBook类

主文件 #include <iostream> #include "GradeBook.h"using namespace std;int main() {GradeBook myGradeBook; // 创建一个对象cout << "请输入课程名称:" ;string courseName;cin >> courseName;cout << "请输入学生人数&…

iOS常见锁及应用(笔记版)

什么是锁&#xff1f; 在程序中&#xff0c;当多个任务&#xff08;或线程&#xff09;同时访问同一个资源时&#xff0c;比如多个操作同时修改一份数据&#xff0c;可能会导致数据不一致。这时候&#xff0c;我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…

vue打包exe之electron-quick-start的npm install 报错

vue打包exe之electron-quick-start的npm install 报错 1、github地址2、问题3、解决4、其他(打包exe)参考 1、github地址 https://github.com/electron/electron-quick-start2、问题 我使用的pnpm install正常安装&#xff0c;执行npm start提示错误 3、解决 在package.js…

Python之一些列表的练习题

1.比较和对比字符串、列表和元组。例如&#xff0c;它们可以容纳哪类内容以及在数据结构上可以做哪些操作。 1. 内容类型:- 字符串: 只能包含字符(文本)。- 列表: 可以包含任意类型的数据,如数字、字符串、其他列表等。- 元组: 可以包含任意类型的数据,与列表类似。3. 操作:(1…

Kaggle-狗种类的识别(Pytorch框架)基本图像识别流程

狗类别实现过程 一. 将数据集按标签分类&#xff0c;将标签转换为数字表示&#xff0c;并制作数据集 二. 搭建网络框架&#xff0c;inception&#xff0c;或者ResNet 三. 选择优化函数&#xff0c;训练模型 数据集制作 首先分析数据集&#xff0c;题中已经很明确告诉有120 种…

头晕,脖子酸痛?颈椎有问题,人就废了一半!颈椎病分3级,不同阶段治疗方法不一样!

每天下午快下班时&#xff0c;在办公室就会看到一种现象&#xff1a; 大家纷纷扭脖子、抬头、耸肩膀......诶&#xff0c;脖子太难受了&#xff01; 毕竟每天长时间的面对电脑&#xff0c;我们的脖子在承受着巨大的压力。尤其&#xff0c;低头 45 度时&#xff0c;脖子甚至承受…

Fyne ( go跨平台GUI )中文文档- 扩展Fyne (七)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

图像处理软件,常用于照片编辑和修饰

一、简介 1、一款功能强大的图像处理软件&#xff0c;常用于照片编辑和修饰。它提供多种工具和特效&#xff0c;允许用户调整照片的亮度、对比度、色彩、锐化等 二、下载 1、文末有下载链接,不明白可以私聊我哈&#xff08;麻烦咚咚咚&#xff0c;动动小手给个关注收藏小三连&a…

【掘金量化使用技巧】用日线合成长周期k线

掘金API中的接口最长的周期是‘1d’的&#xff0c;因此周线/月线/年线等数据需要自己进行合成。 基本思路 用日线合成长周期的k线只需要确定好合成的周期以及需要的数据即可。 周期: 一般行情软件上提供年k、月k、周k&#xff0c;我也选择年、月、周再加一个季度频率。 数据:…

图纸加密防泄密软件 | 从设计到交付,2024年值得关注的图纸加密软件大盘点!

图纸者&#xff0c;匠心之凝聚&#xff0c;智慧之结晶。然&#xff0c;信息之海浩瀚无垠&#xff0c;暗流涌动&#xff0c;图纸之安全&#xff0c;实乃企业之头等大事。 故&#xff0c;择一良器&#xff0c;以密护图纸&#xff0c;实为当务之急。 以下&#xff0c;七款图纸加密…

Linux之实战命令01:xargs应用实例(三十五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

高刷显示器哪个好?540Hz才有资格称高刷

高刷显示器哪个好&#xff1f;说实话&#xff0c;540Hz这些才能成为高刷显示器&#xff0c;什么200,240的&#xff0c;都不够高&#xff0c;什么是从容&#xff0c;有我不用才叫从容。下面我们一起来看看540Hz的高刷显示器都有哪些吧&#xff01; 1.高刷显示器哪个好 - 蚂蚁电…

2024风湿免疫科常用评估量表汇总,附操作步骤与评定标准!

常笑医学整理了5个风湿免疫科常用的评估量表&#xff0c;包括类风湿关节炎患者病情评价&#xff08;DAS28&#xff09;、系统性狼疮活动性测定&#xff08;SLAM&#xff09;等。这些量表在常笑医学网均支持在线评估、下载和创建项目使用。 01 类风湿关节炎患者病情评价 &#x…

实践中如何选择o1或sonnet3-5?

简述 AI更新太快导致我们不知选择什么使用更好&#xff1f;本文对比了新模型o1系列和Claude-3.5-sonnet的一些特点&#xff0c;针对不同开发场景提供了选择建议&#xff0c;希望能为你提供一些模型选择的参考。 模型对比 o1系列: 优势&#xff1a; 推理能力非常强&#xff0…