【搭建自己的人工智能助手----“贾维斯”】

贾维斯

有人不知道贾维斯是哪个吗?贾维斯,(J.A.R.V.I.S.)是美国漫威漫画旗下人工智能。全称为Just A Rather Very Intelligent System(只是一个相当聪明的智能系统),直白点就是人工智能助手。只需要发出指令,就可以帮你做任何事情。
想象一下,当你打开门回家的时,智能助手已经帮忙做完了所有的日常事情,自己只需要安心处理重要的事情即可,这是多么的酷炫、舒服呢
试问,谁不想拥有自己的人工智能助手呢!!!

此系列文章,将从0搭建一套自己的人工智能助手,拥有如下的功能:

  1. 语音唤醒:通过唤醒词“贾维斯”,唤醒人工智能助手
  2. 命令识别:支持识别口述的命令
  3. 命令执行:支持自定义命令,贾维斯根据命令执行功能
  4. 语音答复:命令结果语音反馈
    目前的功能暂时先只有这么多,其他功能后续想到再扩展

代码

代码更新时间: 2025-01-09
已支持功能:

  1. 语音唤醒
  2. 接收语音命令
  3. 输出语音结果
  4. 退出助手

TODO功能:

  1. 支持内置命令、自定义命令
  2. 2分钟之内未获取命令,则自动停止监听,下次使用时需要重新唤醒
import pyaudio
import vosk
import json
from threading import Thread
import pyttsx3
import queue

# 加载Vosk模型
model_path = r"D:\4ai\vosk-model-cn-0.22"  # 修改为你的模型路径
model = vosk.Model(model_path)

WAKE_WORD = "贾维斯"


def answer(asw_q, asw_r):
    # 初始化TTS引擎
    engine = pyttsx3.init()
    print('answer start...')
    while True:
        an_str = asw_q.get()
        if an_str == 'stop':
            break
        print('answer:', an_str)
        engine.say(an_str)
        engine.runAndWait()
        asw_r.put('ok')


def handler_cmd(cmd, asw_q, asw_r):
    print('收到命令:', cmd)
    if '打开' in cmd :
        asw_q.put('正在打开.')
        asw_r.get()
    elif '查询' == cmd :
        asw_q.put('正在查询.')
        asw_r.get()
    elif '关闭' == cmd :
        asw_q.put('正在关闭.')
        asw_r.get()
    elif '下载' == cmd:
        asw_q.put('正在关闭.')
        asw_r.get()
    else:
        asw_q.put('对不起,我不明白这个命令。')
        asw_r.get()


def listen(asw_q, asw_r):
    p = pyaudio.PyAudio()
    # 配置录音参数
    CHUNK = 16000
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 16000
    # 打开音频流
    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)
    # 音频流转换为文本
    rec = vosk.KaldiRecognizer(model, RATE)

    asw_q.put('准备就绪, 等待命令中...')
    asw_r.get()
    activate = False
    stop = False
    while True:
        if stop:
            break
        data = stream.read(CHUNK)
        if len(data) == 0:
            continue
        if rec.AcceptWaveform(data):
            text = json.loads(rec.Result()).get("text", "")
            if len(text) == 0:
                continue

            text = text.replace(' ', '')
            if WAKE_WORD in text:
                activate = True
                asw_q.put('我在.')
                asw_r.get()
                continue

            if not activate:
                print("未检测到唤醒词")
                continue

            if '停止服务' in text :
                asw_q.put('开始停止服务.')
                asw_r.get()
                stop = True
                asw_q.put('stop')
            else:
                handler_cmd(text, asw_q, asw_r)

    stream.stop_stream()
    stream.close()
    p.terminate()


if __name__ == "__main__":
    asw_queue = queue.Queue()
    asw_result = queue.Queue()
    listen_thread = Thread(target=listen, args=(asw_queue, asw_result))
    listen_thread.start()

    answer_thread = Thread(target=answer, args=(asw_queue, asw_result))
    answer_thread.start()

    listen_thread.join()
    answer_thread.join()

ps: 将使用python语言进行开发,请不会python的提前学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值