当前位置: 首页 > news >正文

用Python打造专属本地贾维斯:声纹识别+离线交互,隐私安全不依赖云端

每个看过《钢铁侠》的人,大概都曾幻想拥有一个“私人定制”的贾维斯——它能听懂你的指令,不泄露任何隐私,更不会被陌生人误触发。但市面上的智能助手要么依赖云端(数据不安全),要么缺乏“专属感”(谁喊都回应)。

今天,我们就用Python从零打造一个**完全本地运行**的贾维斯:支持声纹识别(只认你的声音)、语音交互(听+说全离线)、自定义指令(控制电脑/家电),甚至能加个可视化界面。全程开源免费,新手也能跟着做。

一、为什么要做“本地声纹贾维斯”?

在ChatGPT、小爱同学遍地的时代,手动造一个本地贾维斯,核心价值有三个:

  1. 隐私绝对安全:所有数据(语音、指令、声纹)都存在本地,不连网、不上云,避免“语音被监听”的风险。

  2. 专属唤醒不误触:通过声纹识别锁定你的声音,别人喊“贾维斯”也没用,彻底解决“误唤醒”尴尬。

  3. 功能自定义自由:想让它打开浏览器、控制台灯,甚至帮你跑Python脚本?一行代码就能扩展,不用等官方更新。

我们的目标很明确:先实现“能听、会说、认人、干活”的基础版,再留足扩展空间,让你后续能按需升级。

二、准备工作:软硬件清单(门槛极低)

1. 硬件(你大概率已经有了)

  • 一台电脑(Windows/macOS/Linux均可,最低4GB内存);

  • 一个麦克风(笔记本自带的就行,要求不高);

  • (可选)智能家居设备(如小米台灯、博联插座,后续可加控制功能)。

2. 软件(全开源免费)

  • 语音识别:OpenAI Whisper(离线识别,支持中文,精度高);

  • 语音合成:pyttsx3(离线TTS,支持调整语速/音量);

  • 声纹识别:SpeechBrain(轻量开源库,预训练模型仅100MB);

  • 界面(可选):PyQt5(简单可视化,不用记命令行);

  • 其他辅助:pyaudio(录音)、psutil(控制电脑进程)。

3. 环境搭建( step by step 避坑)

先按系统安装依赖,命令行复制粘贴即可,遇到问题看注释里的解决方案。

(1)安装Python基础依赖
# 1. 安装核心库(Whisper、声纹、TTS等)
pip install openai-whisper pyttsx3 pyaudio speechbrain torch torchaudio librosa# 2. 解决PyAudio安装失败问题(Windows用户专属)
# 若上面pip install pyaudio报错,先装pipwin再装
pip install pipwin
pipwin install pyaudio# 3. 安装FFmpeg(Whisper录音识别必需,处理音频用)
# Windows:先装Chocolatey(包管理器),再装FFmpeg
# 第一步:以管理员身份打开命令行,装Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 第二步:装FFmpeg
choco install ffmpeg# macOS:用brew装
brew install ffmpeg# Linux:用apt装
sudo apt install ffmpeg

(2)提前下载Whisper模型(可选,加速首次运行)

Whisper第一次运行会自动下载模型,推荐手动下载**base模型**(1GB,兼顾速度和精度,适合本地):

  • 下载地址:Whisper模型库(下载base.pt文件);

  • 保存路径:

    • Windows:C:\Users\你的用户名\.cache\whisper\

    • macOS/Linux:~/.cache/whisper/

三、核心实现:四步打造带声纹的贾维斯

我们分四步递进,每一步都能独立运行测试,避免一步错全错。

Step 1:基础语音交互——让贾维斯“听”和“说”

先实现最核心的“语音输入→文字识别→语音输出”闭环,确保贾维斯能听懂你说的话,还能回应。

创建文件 jarvis_basic.py,代码带详细注释,复制就能跑:

import whisper
import pyttsx3
import pyaudio
import wave
import time# -------------------------- 初始化模块 --------------------------
def init_whisper(model_name="base"):"""初始化Whisper语音识别(离线)"""print("正在加载语音识别模型...")model = whisper.load_model(model_name)  # 加载base模型,1GBreturn modeldef init_tts():"""初始化pyttsx3语音合成(离线)"""tts = pyttsx3.init()# 调整语速(100-200,默认200,160更自然)tts.setProperty('rate', 160)# 调整音量(0.0-1.0,0.9足够响)tts.setProperty('volume', 0.9)# 选择中文语音(Windows需先装中文语音包,见下文)voices = tts.getProperty('voices')try:tts.setProperty('voice', voices[1].id)  # 1通常是中文,0是英文except IndexError:print("未找到中文语音包,使用默认英文语音")tts.setProperty('voice', voices[0].id)return ttsdef record_audio(duration=5, save_path="temp_audio.wav"):"""录音:从麦克风录duration秒,保存为WAV文件"""# 音频参数(Whisper要求16kHz、单声道)FORMAT = pyaudio.paInt16CHANNELS = 1RATE = 16000CHUNK = 1024p = pyaudio.PyAudio()stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)print(f"正在倾听...({duration}秒内说话,按Ctrl+C停止)")frames = []try:for _ in range(0, int(RATE / CHUNK * duration)):data = stream.read(CHUNK)frames.append(data)except KeyboardInterrupt:print("已停止倾听")# 保存录音wf = wave.open(save_path, 'wb')wf.setnchannels(CHANNELS)wf.setsampwidth(p.get_sample_size(FORMAT))wf.setframerate(RATE)wf.writeframes(b''.join(frames))wf.close()stream.stop_stream()stream.close()p.terminate()return save_path# -------------------------- 核心交互逻辑 --------------------------
def voice_interaction(whisper_model, tts):"""语音交互循环:录音→识别→回应"""print("\n贾维斯已启动!说“退出”可结束程序")tts.say("贾维斯已启动,你可以说话了")tts.runAndWait()while True:# 1. 录音5秒audio_path = record_audio(duration=5)# 2. 语音识别(中文)result = whisper_model.transcribe(audio_path, language="zh")user_text = result["text"].strip()if not user_text:tts.say("我没听清,请再说一遍")tts.runAndWait()continueprint(f"\n你说:{user_text}")# 3. 简单指令回应response = ""if "你好" in user_text or "唤醒" in user_text:response = "你好,我是你的专属贾维斯,随时为你服务"elif "时间" in user_text:current_time = time.strftime("%H:%M:%S", time.localtime())response = f"现在时间是 {current_time}"elif "退出" in user_text or "再见" in user_text:response = "再见,期待下次为你服务"print(f"贾维斯:{response}")tts.say(response)tts.runAndWait()breakelse:response = "我已记录你的指令:" + user_text# 4. 语音回应print(f"贾维斯:{response}")tts.say(response)tts.runAndWait()# -------------------------- 启动程序 --------------------------
if __name__ == "__main__":# 解决Windows中文语音问题:控制面板→时钟和区域→语音识别→文本到语音→添加“Microsoft 慧涛”whisper_model = init_whisper()tts = init_tts()voice_interaction(whisper_model, tts)

测试Step 1:
  1. 运行 python jarvis_basic.py,等待模型加载完成;

  2. 听到“贾维斯已启动”后,说“现在几点了”,贾维斯会识别并播报时间;

  3. 说“退出”,程序结束。

注意:若贾维斯用英文回应,需在Windows控制面板安装中文语音包(见代码注释),macOS/Linux默认支持多语言。

Step 2:声纹识别整合——让贾维斯只认你的声音

这一步是核心,用SpeechBrain实现“声纹注册→验证”闭环:只有你(或已注册用户)的声音能通过验证,后续才能下达指令。

创建文件 jarvis_voiceprint.py,整合声纹功能:

import whisper
import pyttsx3
import pyaudio
import wave
import time
import pickle
import os
from pathlib import Path
from speechbrain.inference.speaker import SpeakerRecognition  # 声纹识别核心# -------------------------- 配置参数 --------------------------
# 声纹模板保存路径(注册后生成,删除需重新注册)
VOICEPRINT_TEMPLATE = Path("my_voiceprint.pkl")
# 声纹验证阈值(0.0-1.0,越高越严格,0.8适合日常)
VERIFY_THRESHOLD = 0.8
# 录音参数(声纹模型要求16kHz、单声道)
AUDIO_PARAMS = {"format": pyaudio.paInt16,"channels": 1,"rate": 16000,"chunk": 1024,"register_duration": 3,  # 注册时每段录音3秒"verify_duration": 1     # 验证时录音1秒(快速)
}# -------------------------- 基础模块初始化 --------------------------
def init_whisper(model_name="base"):print("加载语音识别模型...")return whisper.load_model(model_name)def init_tts():tts = pyttsx3.init()tts.setProperty('rate', 160)tts.setProperty('volume', 0.9)voices = tts.getProperty('voices')try:tts.setProperty('voice', voices[1].id)  # 中文语音except IndexError:tts.setProperty('voice', voices[0].id)return ttsdef init_voiceprint_model():"""初始化声纹识别模型(SpeechBrain)"""print("加载声纹识别模型...")return SpeakerRecognition.from_hparams(source="speechbrain/spkrec-ecapa-tdnn",savedir="voiceprint_model",  # 模型保存路径run_opts={"device": "cpu"}   # 不用GPU,CPU足够)def record_audio(duration, save_path="temp.wav"):"""通用录音函数,适配声纹模型"""p = pyaudio.PyAudio()stream = p.open(format=AUDIO_PARAMS["format"],channels=AUDIO_PARAMS["channels"],rate=AUDIO_PARAMS["rate"],input=True,frames_per_buffer=AUDIO_PARAMS["chunk"])print(f"录音中({duration}秒)...")frames = []for _ in range(0, int(AUDIO_PARAMS["rate"] / AUDIO_PARAMS["chunk"] * duration)):data = stream.read(AUDIO_PARAMS["chunk"])frames.append(data)wf = wave.open(save_path, 'wb')wf.setnchannels(AUDIO_PARAMS["channels"])wf.setsampwidth(p.get_sample_size(AUDIO_PARAMS["format"]))wf.setframerate(AUDIO_PARAMS["rate"])wf.writeframes(b''.join(frames))wf.close()stream.stop_stream()stream.close()p.terminate()return save_path# -------------------------- 声纹核心功能 --------------------------
def register_voiceprint(voiceprint_model, tts):"""声纹注册:采集5段语音,生成专属声纹模板"""if VOICEPRINT_TEMPLATE.exists():tts.say("已检测到声纹模板,是否覆盖?说“是”或“否”")tts.runAndWait()# 录1秒确认audio_path = record_audio(duration=1)result = whisper.load_model("base").transcribe(audio_path, language="zh")os.remove(audio_path)if "是" not in result["text"]:print("取消覆盖,使用现有声纹模板")return pickle.load(open(VOICEPRINT_TEMPLATE, "rb"))# 采集5段语音(确保环境安静,内容任意)tts.say("开始声纹注册,需要录制5段语音,每段3秒")tts.runAndWait()voice_features = []  # 存储多段语音的声纹特征for i in range(5):tts.say(f"正在录制第{i+1}段语音,请说话")tts.runAndWait()audio_path = record_audio(duration=AUDIO_PARAMS["register_duration"])# 提取声纹特征(嵌入向量)feature = voiceprint_model.encode_file(audio_path)voice_features.append(feature)os.remove(audio_path)  # 删除临时录音tts.say(f"第{i+1}段录制完成")tts.runAndWait()# 计算平均特征(提升稳定性)avg_feature = sum(voice_features) / len(voice_features)# 保存声纹模板pickle.dump(avg_feature, open(VOICEPRINT_TEMPLATE, "wb"))tts.say("声纹注册成功,以后只有你的声音能唤醒我")tts.runAndWait()print(f"声纹模板已保存至:{VOICEPRINT_TEMPLATE}")return avg_featuredef verify_voiceprint(voiceprint_model, voiceprint_template, tts):"""声纹验证:对比实时语音与模板,返回是否通过"""tts.say("请说话进行身份验证")tts.runAndWait()# 录1秒验证语音audio_path = record_audio(duration=AUDIO_PARAMS["verify_duration"])try:# 提取实时声纹特征realtime_feature = voiceprint_model.encode_file(audio_path)# 计算相似度(余弦相似度,0-1之间)similarity = voiceprint_model.similarity(voiceprint_template, realtime_feature)[0][0].item()os.remove(audio_path)print(f"声纹相似度:{similarity:.2f}(阈值:{VERIFY_THRESHOLD})")if similarity >= VERIFY_THRESHOLD:tts.say("身份验证通过")return Trueelse:tts.say(f"身份验证失败,相似度不足{VERIFY_THRESHOLD}")return Falseexcept Exception as e:os.remove(audio_path)tts.say("验证出错,请重试")print(f"验证错误:{str(e)}")return False# -------------------------- 带声纹的交互逻辑 --------------------------
def voiceprint_interaction(whisper_model, tts, voiceprint_model, voiceprint_template):"""声纹验证→指令交互"""print("\n贾维斯已启动,等待身份验证...")tts.say("贾维斯已启动,等待身份验证")tts.runAndWait()while True:# 第一步:先过声纹验证if not verify_voiceprint(voiceprint_model, voiceprint_template, tts):time.sleep(2)continue# 第二步:验证通过,监听指令tts.say("请下达指令")tts.runAndWait()audio_path = record_audio(duration=5)# 第三步:语音识别result = whisper_model.transcribe(audio_path, language="zh")user_text = result["text"].strip()os.remove(audio_path)if not user_text:tts.say("我没听清,请再说一遍")tts.runAndWait()continueprint(f"\n你说:{user_text}")# 第四步:指令回应response = ""if "你好" in user_text:response = "你好,随时为你服务"elif "时间" in user_text:response = f"现在时间是{time.strftime('%H:%M:%S', time.localtime())}"elif "退出" in user_text:response = "再见,期待下次见"print(f"贾维斯:{response}")tts.say(response)tts.runAndWait()breakelse:response = "已记录指令:" + user_textprint(f"贾维斯:{response}")tts.say(response)tts.runAndWait()# -------------------------- 启动程序 --------------------------
if __name__ == "__main__":# 初始化所有模块whisper_model = init_whisper()tts = init_tts()voiceprint_model = init_voiceprint_model()# 加载/注册声纹模板if VOICEPRINT_TEMPLATE.exists():print("加载现有声纹模板...")voiceprint_template = pickle.load(open(VOICEPRINT_TEMPLATE, "rb"))else:print("未检测到声纹模板,开始注册...")voiceprint_template = register_voiceprint(voiceprint_model, tts)# 启动带声纹的交互voiceprint_interaction(whisper_model, tts, voiceprint_model, voiceprint_template)

测试Step 2:
  1. 运行 python jarvis_voiceprint.py,首次启动会提示“开始声纹注册”;

  2. 按提示录制5段语音(比如每段说“贾维斯你好”),环境尽量安静;

  3. 注册完成后,贾维斯会提示“请说话进行身份验证”,你说任意1秒内容,会显示“身份验证通过”;

  4. 让别人说同样的话,会提示“验证失败”(声纹不匹配)。

优化建议:若自己的声音偶尔验证失败,可降低 VERIFY_THRESHOLD 到0.7;若想更严格,可提到0.9。

Step 3:指令控制升级——让贾维斯帮你干活

现在贾维斯能认人了,接下来让它“有用”:控制电脑(打开浏览器/记事本)、查看系统状态(内存使用率),甚至控制智能家居。

jarvis_voiceprint.py 中添加 **指令执行函数**,并修改交互逻辑:

# -------------------------- 新增:指令执行功能 --------------------------
import subprocess
import psutildef execute_command(command_type):"""执行系统指令/控制设备"""try:if command_type == "open_browser":# Windows打开Chrome(路径替换成你的浏览器路径)chrome_path = r"C:\Program Files\Google\Chrome\Application\chrome.exe"if os.path.exists(chrome_path):subprocess.Popen([chrome_path])else:subprocess.Popen(["start", "chrome"], shell=True)  # 找不到路径时用系统默认return "已打开浏览器"elif command_type == "check_memory":# 查看电脑内存使用率memory = psutil.virtual_memory()used_percent = memory.percentavailable_mb = memory.available // 1024 // 1024return f"当前内存使用率{used_percent}%,可用内存{available_mb}MB"elif command_type == "open_notepad":# 打开记事本subprocess.Popen(["notepad.exe"])return "已打开记事本"elif command_type == "close_notepad":# 关闭所有记事本for proc in psutil.process_iter():if proc.name() == "notepad.exe":proc.terminate()return "已关闭所有记事本"# (可选)添加智能家居控制,以小米台灯为例# 需要先装:pip install python-miio# elif command_type == "turn_on_light":#     from miio import Light#     light = Light("你的台灯IP", "你的设备Token")#     light.on()#     return "小米台灯已打开"else:return "暂不支持该指令"except Exception as e:return f"执行失败:{str(e)[:20]}"# -------------------------- 修改:交互逻辑中的指令响应 --------------------------
def voiceprint_interaction(whisper_model, tts, voiceprint_model, voiceprint_template):# (前面代码不变,跳过...)# 第四步:指令回应(修改这部分)response = ""if "你好" in user_text:response = "你好,随时为你服务"elif "时间" in user_text:response = f"现在时间是{time.strftime('%H:%M:%S', time.localtime())}"# 新增指令elif "打开浏览器" in user_text:response = execute_command("open_browser")elif "内存" in user_text:response = execute_command("check_memory")elif "打开记事本" in user_text:response = execute_command("open_notepad")elif "关闭记事本" in user_text:response = execute_command("close_notepad")# elif "打开台灯" in user_text:  # 智能家居指令#     response = execute_command("turn_on_light")elif "退出" in user_text:response = "再见,期待下次见"print(f"贾维斯:{response}")tts.say(response)tts.runAndWait()breakelse:response = "已记录指令:" + user_text

测试Step 3:
  1. 运行程序,通过声纹验证后;

  2. 说“打开浏览器”,贾维斯会启动Chrome;

  3. 说“查看内存使用率”,贾维斯会播报当前内存状态;

  4. 说“打开记事本”“关闭记事本”,测试进程控制。

扩展提示:想控制智能家居?以小米设备为例,需要获取设备IP和Token(教程:小米设备Token获取方法),然后按代码注释中的示例添加指令。

Step 4:加个GUI界面——可视化操作更友好

命令行用着麻烦?用PyQt5做个简单界面,支持“声纹注册、手动控制、指令日志”,适合不喜欢敲命令的用户。

创建文件 jarvis_gui.py

import sys
import pickle
import os
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QTextEdit)
from PyQt5.QtCore import QThread, pyqtSignal, Qt
from PyQt5.QtGui import QFont
import jarvis_voiceprint  # 导入前面写的核心逻辑class JarvisWorker(QThread):"""后台线程:声纹验证+指令交互,不阻塞GUI"""log_signal = pyqtSignal(str, str)  # (类型:用户输入/状态,内容)def __init__(self, whisper_model, tts, voiceprint_model, voiceprint_template):super().__init__()self.whisper_model = whisper_modelself.tts = ttsself.voiceprint_model = voiceprint_modelself.voiceprint_template = voiceprint_templateself.running = Truedef run(self):while self.running:# 声纹验证self.log_signal.emit("状态", "等待身份验证,请说话...")verify_ok = jarvis_voiceprint.verify_voiceprint(self.voiceprint_model, self.voiceprint_template, self.tts)if not verify_ok:self.log_signal.emit("状态", "声纹验证失败,3秒后重试...")self.msleep(3000)continueself.log_signal.emit("状态", "声纹验证通过,请下达指令...")# 监听指令audio_path = jarvis_voiceprint.record_audio(duration=5)result = self.whisper_model.transcribe(audio_path, language="zh")user_text = result["text"].strip()os.remove(audio_path)if not user_text:self.log_signal.emit("贾维斯", "我没听清,请再说一遍")self.tts.say("我没听清,请再说一遍")self.tts.runAndWait()continue# 指令处理if "退出" in user_text:self.log_signal.emit("你", user_text)self.log_signal.emit("贾维斯", "再见,期待下次见")self.tts.say("再见,期待下次见")self.tts.runAndWait()self.running = Falsereturnelif "打开浏览器" in user_text:response = jarvis_voiceprint.execute_command("open_browser")elif "内存" in user_text:response = jarvis_voiceprint.execute_command("check_memory")else:response = "已记录指令:" + user_textself.log_signal.emit("你", user_text)self.log_signal.emit("贾维斯", response)self.tts.say(response)self.tts.runAndWait()class JarvisGUI(QMainWindow):def __init__(self, whisper_model, tts, voiceprint_model, voiceprint_template):super().__init__()self.setWindowTitle("专属贾维斯(声纹版)")self.setGeometry(100, 100, 800, 600)  # 窗口位置和大小self.whisper_model = whisper_modelself.tts = ttsself.voiceprint_model = voiceprint_modelself.voiceprint_template = voiceprint_template# 初始化界面self.init_ui()# 启动后台线程self.start_worker()def init_ui(self):# 中心部件central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)main_layout.setContentsMargins(20, 20, 20, 20)main_layout.setSpacing(15)# 标题title_label = QLabel("专属贾维斯智能助手")title_label.setFont(QFont("微软雅黑", 24, QFont.Bold))title_label.setAlignment(Qt.AlignCenter)title_label.setStyleSheet("color: #1E90FF;")main_layout.addWidget(title_label)# 状态提示self.status_label = QLabel("状态:初始化完成,等待后台线程启动...")self.status_label.setFont(QFont("微软雅黑", 12))self.status_label.setStyleSheet("color: #2E8B57;")main_layout.addWidget(self.status_label)# 指令日志log_label = QLabel("交互日志:")log_label.setFont(QFont("微软雅黑", 14, QFont.Bold))main_layout.addWidget(log_label)self.log_edit = QTextEdit()self.log_edit.setFont(QFont("微软雅黑", 12))self.log_edit.setReadOnly(True)self.log_edit.setPlaceholderText("交互内容会显示在这里...")main_layout.addWidget(self.log_edit)# 功能按钮btn_layout = QHBoxLayout()btn_layout.setSpacing(10)# 声纹注册按钮self.register_btn = QPushButton("重新注册声纹")self.register_btn.setFont(QFont("微软雅黑", 12))self.register_btn.setStyleSheet("background-color: #FF6347; color: white;")self.register_btn.clicked.connect(self.re_register_voiceprint)# 手动控制按钮self.browser_btn = QPushButton("打开浏览器")self.browser_btn.setFont(QFont("微软雅黑", 12))self.browser_btn.clicked.connect(lambda: self.run_cmd("open_browser"))self.memory_btn = QPushButton("查看内存")self.memory_btn.setFont(QFont("微软雅黑", 12))self.memory_btn.clicked.connect(lambda: self.run_cmd("check_memory"))# 退出按钮self.exit_btn = QPushButton("退出")self.exit_btn.setFont(QFont("微软雅黑", 12))self.exit_btn.setStyleSheet("background-color: #4169E1; color: white;")self.exit_btn.clicked.connect(self.close_app)# 添加按钮到布局btn_layout.addWidget(self.register_btn)btn_layout.addWidget(self.browser_btn)btn_layout.addWidget(self.memory_btn)btn_layout.addWidget(self.exit_btn)main_layout.addLayout(btn_layout)def start_worker(self):"""启动后台交互线程"""self.worker = JarvisWorker(self.whisper_model, self.tts, self.voiceprint_model, self.voiceprint_template)self.worker.log_signal.connect(self.update_log)self.worker.start()def update_log(self, log_type, content):"""更新日志和状态"""if log_type == "状态":self.status_label.setText(f"状态:{content}")self.log_edit.append(f"【状态】{content}\n")else:self.log_edit.append(f"{log_type}:{content}")# 滚动到底部self.log_edit.verticalScrollBar().setValue(self.log_edit.verticalScrollBar().maximum())def run_cmd(self, cmd_type):"""手动点击执行指令"""response = jarvis_voiceprint.execute_command(cmd_type)self.log_edit.append(f"【手动操作】贾维斯:{response}\n")self.tts.say(response)self.tts.runAndWait()def re_register_voiceprint(self):"""重新注册声纹"""self.log_edit.append("【操作】开始重新注册声纹...\n")self.tts.say("开始重新注册声纹,请按提示录制")self.tts.runAndWait()# 调用注册函数new_template = jarvis_voiceprint.register_voiceprint(self.voiceprint_model, self.tts)self.voiceprint_template = new_template# 更新后台线程的模板self.worker.voiceprint_template = new_templateself.log_edit.append("【操作】声纹重新注册成功!\n")def close_app(self):"""关闭程序"""self.worker.running = Falseself.worker.wait()self.close()# -------------------------- 启动GUI --------------------------
if __name__ == "__main__":# 初始化核心模块whisper_model = jarvis_voiceprint.init_whisper()tts = jarvis_voiceprint.init_tts()voiceprint_model = jarvis_voiceprint.init_voiceprint_model()# 加载/注册声纹模板if jarvis_voiceprint.VOICEPRINT_TEMPLATE.exists():voiceprint_template = pickle.load(open(jarvis_voiceprint.VOICEPRINT_TEMPLATE, "rb"))else:voiceprint_template = jarvis_voiceprint.register_voiceprint(voiceprint_model, tts)# 启动GUI应用app = QApplication(sys.argv)window = JarvisGUI(whisper_model, tts, voiceprint_model, voiceprint_template)window.show()sys.exit(app.exec_())

测试Step 4:
  1. 运行 python jarvis_gui.py,会弹出一个蓝色标题的窗口;

  2. 窗口中能看到“交互日志”,后台会自动进行声纹验证;

  3. 点击“重新注册声纹”可更新你的声纹模板;

  4. 点击“打开浏览器”“查看内存”,可手动触发指令(无需语音)。

四、进阶优化:让贾维斯更像“钢铁侠版”

基础版已经能用了,想让它更智能?试试这些扩展方向:

1. 离线唤醒词:喊“贾维斯”才唤醒

现在的贾维斯一直录音监听,有点耗电。用 pvporcupine 库实现离线唤醒词:只有喊“贾维斯”时,才启动声纹验证和指令监听。

  • 安装:pip install pvporcupine

  • 教程:Porcupine官方文档(支持自定义唤醒词)。

2. 多用户支持:全家共用

修改声纹模板保存逻辑,支持多个用户(如 dad_voiceprint.pklmom_voiceprint.pkl),验证时可选择“验证爸爸”或“验证妈妈”。

3. 本地大模型:让贾维斯更懂你

现在的贾维斯只能识别固定指令,接入本地大模型(如Llama 3、Qwen),让它能理解自然语言(比如“今天天气怎么样”“帮我写个Python脚本”):

  • 安装:pip install llama-cpp-python

  • 模型:下载Qwen-1.8B本地模型(约1GB,适合电脑运行);

  • 整合:在指令响应中添加“用大模型回答问题”的逻辑。

4. 控制更多设备:从电脑到全屋

  • 控制家电:对接小米、博联、HomeAssistant;

  • 控制电脑软件:打开VS Code、播放音乐、关闭浏览器;

  • 控制硬件:通过串口控制Arduino(比如开关灯、控制电机)。

五、结语:你的贾维斯,由你定义

这篇教程从“能听会说”到“声纹专属”,再到“干活控制”,一步步打造了一个本地运行的贾维斯。最棒的是,它完全属于你——数据不联网,功能可自定义,甚至能根据你的喜好调整“性格”(比如让它用四川话回应)。

现在,你可以从基础版开始,慢慢扩展:今天加个“控制台灯”,明天加个“本地问答”,后天让它帮你监控电脑内存……最终,打造一个真正“懂你”的专属助手。

如果在实现过程中遇到问题,欢迎在评论区交流——毕竟,每个贾维斯都需要不断打磨才能更完美~

http://www.dtcms.com/a/431767.html

相关文章:

  • 智能体长记忆解决方案Mem0和Memobase
  • 健康网站模板正规电商平台
  • 网站布局内容tomcat wordpress
  • LeetCode 刷题【94. 二叉树的中序遍历、95. 不同的二叉搜索树 II】
  • 【代码随想录day 31】 力扣 738.单调递增的数字
  • 上海网站设计 企业有赞微商城入口
  • 【Leetcode高效算法】用双指针策略打破有效三角形的个数
  • 浏览器为什么打不开网站wordpress搭建多人博客
  • 牛客算法刷题noob57 凯撒加密
  • 计算机类毕业设计开题报告注意事项
  • Qt QML创建多线程(示例存读数据库)
  • 2026届计算机毕业设计选题推荐
  • 邹城市网站建设长春网站建设方案外包
  • 合肥建公司网站万户信息 做网站怎么样
  • 第十篇:告别new和delete:RAII机制与智能指针导论
  • 做搜狗pc网站优化快速深圳企业模板建站
  • 深度学习第十章 循环神经网络
  • 设计一个外贸网站需要多少钱wordpress 博客地址更改
  • ASP网站建设实训报告总结大德通众包做网站怎么样
  • 查询网站死链接温州百度快速排名优化
  • 网站建设全包哪家便宜怎么在网站上做按钮
  • 永州网站建设哪家好中信建设有限责任公司深圳中信金融中心项目工期专业招标
  • 八年级信息网站怎么做网站设计的价格
  • OSPF Init 状态 概念及题目
  • 事件相关电位(Event-Related Potential,ERP)
  • 运营一个网站的成本wordpress 网站小模块
  • 怀化市建设局网站地址wordpress建什么站
  • 网站域名解析怎么做wordpress筛选最新文章
  • 【知识科普】JSON数据格式详细介绍
  • wordpress站酷首页wordpress引用jquery