贾维斯
有人不知道贾维斯是哪个吗?贾维斯,(J.A.R.V.I.S.)是美国漫威漫画旗下人工智能。全称为Just A Rather Very Intelligent System(只是一个相当聪明的智能系统),直白点就是人工智能助手。只需要发出指令,就可以帮你做任何事情。
想象一下,当你打开门回家的时,智能助手已经帮忙做完了所有的日常事情,自己只需要安心处理重要的事情即可,这是多么的酷炫、舒服呢
试问,谁不想拥有自己的人工智能助手呢!!!
此系列文章,将从0搭建一套自己的人工智能助手,拥有如下的功能:
- 语音唤醒:通过唤醒词“贾维斯”,唤醒人工智能助手
- 命令识别:支持识别口述的命令
- 命令执行:支持自定义命令,贾维斯根据命令执行功能
- 语音答复:命令结果语音反馈
目前的功能暂时先只有这么多,其他功能后续想到再扩展
代码
代码更新时间: 2025-01-09
已支持功能:
- 语音唤醒
- 接收语音命令
- 输出语音结果
- 退出助手
TODO功能:
- 支持内置命令、自定义命令
- 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的提前学习