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

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下)

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下)

摘要

本文介绍了家庭网站V1.3版本的更新内容,主要聚焦于AI管家功能的优化与完善。V1.3版本对AI管家模块进行了全面升级,包括使用更快速的GLM-4-Flash模型、优化语音交互体验、改进用户界面以及增强系统稳定性。本文详细解析了这些改进的技术实现,包括语音识别与合成、WebSocket通信优化以及服务器启动机制的完善。
在这里插入图片描述
在这里插入图片描述

新增功能点和代码实现解析

1. 升级到GLM-4-Flash模型

V1.3版本将AI管家的底层模型从GLM-4升级到了GLM-4-Flash,这是一个更快速的大语言模型,能够提供更快的响应速度。

# 在utils.py中更新模型配置
def __init__(self, api_key=None, model=None):"""初始化智谱AI助手"""self.api_key = api_key or current_app.config.get('ZHIPUAI_API_KEY')# 使用配置的模型self.model = model or current_app.config.get('ZHIPUAI_MODEL', 'glm-4-flash')
# 在config.py中设置默认模型
ZHIPUAI_MODEL = os.environ.get('ZHIPUAI_MODEL', 'glm-4-flash')

2. 优化语音识别与合成功能

V1.3版本简化了语音交互流程,移除了复杂的实时音视频API,转而使用更可靠的语音识别和浏览器原生语音合成功能。

def speech_to_text(self, audio_data):"""将音频转换为文本"""try:current_app.logger.info("开始进行语音识别...")# 使用智谱AI的语音识别APIurl = "https://open.bigmodel.cn/api/paas/v3/audio/transcriptions"headers = self.get_auth_headers()# 准备文件数据files = {'file': ('audio.wav', audio_data, 'audio/wav')}# 准备表单数据data = {'model': 'whisper-1',  # 使用Whisper模型进行语音识别'language': 'zh'       # 指定语言为中文}# 发送请求并处理响应response = requests.post(url, headers=headers, files=files, data=data, timeout=30)# ...处理响应逻辑except Exception as e:# ...错误处理

前端语音合成实现:

function speakText(text) {if ('speechSynthesis' in window) {// 停止任何正在进行的语音window.speechSynthesis.cancel();const utterance = new SpeechSynthesisUtterance(text);utterance.lang = 'zh-CN';// 获取可用的语音const voices = window.speechSynthesis.getVoices();// 尝试找到中文女声const chineseVoice = voices.find(voice => voice.lang.includes('zh') && voice.name.includes('Female'));if (chineseVoice) {utterance.voice = chineseVoice;}// 设置语速和音调utterance.rate = 1.0;  // 正常语速utterance.pitch = 1.0; // 正常音调// 播放语音window.speechSynthesis.speak(utterance);}
}

3. 改进WebSocket通信

V1.3版本优化了WebSocket通信机制,解决了连接不稳定和握手失败的问题:

# 在app/__init__.py中优化SocketIO配置
socketio = SocketIO(async_mode='eventlet', cors_allowed_origins='*', logger=True, engineio_logger=True, manage_session=False
)# 初始化时设置更多参数
socketio.init_app(app, cors_allowed_origins="*", ping_timeout=60, ping_interval=25, transports=['websocket', 'polling'], manage_session=False
)

前端WebSocket连接配置:

let socket = io({transports: ['websocket', 'polling'],reconnectionAttempts: 5,reconnectionDelay: 1000
});

4. 智能端口管理

V1.3版本增加了智能端口管理功能,可以自动检测端口占用并切换到可用端口:

def is_port_in_use(port):"""检查端口是否被占用"""with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:return s.connect_ex(('localhost', port)) == 0# 检查端口是否被占用
if is_port_in_use(port):print(f"警告: 端口 {port} 已被占用,尝试使用其他端口...")# 尝试其他端口for test_port in range(5001, 5010):if not is_port_in_use(test_port):port = test_portprint(f"使用端口 {port}")breakelse:print("错误: 无法找到可用端口,请手动关闭占用端口的进程")sys.exit(1)

5. 端口释放工具

V1.3版本提供了一个实用工具脚本,用于释放被占用的端口:

def kill_process_on_port(port):"""关闭占用指定端口的进程"""try:# 查找占用端口的进程result = subprocess.check_output(f'netstat -ano | findstr :{port}', shell=True).decode()if not result:print(f"端口 {port} 没有被占用")return False# 解析进程ID并关闭进程lines = result.strip().split('\n')for line in lines:parts = [p for p in line.split(' ') if p]if len(parts) >= 5:pid = parts[-1]# ...获取进程信息并关闭进程except Exception as e:print(f"发生错误: {e}")return False

完善和修订部分

1. 修复typing indicator问题

V1.3版本修复了AI回复时多余的等待指示符问题:

// 添加一个函数来移除typing indicator
function removeTypingIndicator() {const typingIndicator = document.getElementById('typingIndicator');if (typingIndicator) {typingIndicator.remove();}
}function appendTypingIndicator() {// 先移除已存在的typing indicator,避免重复const existingIndicator = document.getElementById('typingIndicator');if (existingIndicator) {existingIndicator.remove();}// ...创建新的typing indicator
}

后端也相应增加了关闭typing indicator的信号发送:

# 关闭AI正在输入的指示器
emit('typing_indicator', {'show': False})

2. 简化代码结构

V1.3版本移除了所有与视频处理相关的复杂代码,简化了整体架构:

  • 删除了WebSocket相关的实时音视频处理代码
  • 移除了视频模式切换功能
  • 简化了ZhipuAIHelper类,只保留必要的HTTP API调用

3. 解决eventlet的monkey_patch问题

V1.3版本修复了eventlet的monkey_patch问题,确保在导入其他模块前进行monkey patching:

import eventlet
eventlet.monkey_patch()# 之后再导入其他模块
import socket
import sys
import os
from app import create_app, socketio

4. 增强错误处理

V1.3版本增强了错误处理机制,提供更友好的错误提示:

try:# ...启动服务器
except OSError as e:if e.errno == 10048:  # 端口已被占用print(f"错误: 端口 {port} 已被占用,请关闭占用该端口的应用后重试")print(f"提示: 可以使用 'netstat -ano | findstr :{port}' 查找占用端口的进程")else:print(f"启动服务器时出错: {e}")sys.exit(1)
except KeyboardInterrupt:print("服务器已停止")sys.exit(0)

总结

家庭网站V1.3版本对AI管家功能进行了全面优化,主要体现在以下几个方面:

  1. 性能提升:通过升级到GLM-4-Flash模型,大幅提高了AI响应速度。

  2. 用户体验改进:优化了语音交互流程,使用更可靠的语音识别和合成方案,提供更流畅的对话体验。

  3. 稳定性增强:改进了WebSocket通信机制,解决了连接不稳定和握手失败的问题;增加了智能端口管理和端口释放工具,提高了系统启动的可靠性。

  4. 代码质量提升:简化了代码结构,移除了复杂的视频处理代码,增强了错误处理机制,使系统更加健壮。

V1.3版本的这些改进使AI管家功能更加稳定、高效,为用户提供了更好的交互体验。未来的版本将继续优化AI功能,可能会增加更多智能化特性,如情感分析、个性化推荐等,进一步提升家庭网站的智能化水平。

相关文章:

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下)

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下) 摘要 本文介绍了家庭网站V1.3版本的更新内容,主要聚焦于AI管家功能的优化与完善。V1.3版本对AI管家模块进行了全面升级&#xff0…...

华为OD机试 - 创建二叉树(Java 2024 E卷 200分)

题目描述 给定一系列树状结构操作的问题,通过 Q 次查询还原树结构并输出结果。题目要求实现一个类 Solution,其方法 recoverTree 需要根据输入的操作数组 operations 还原树的结构,并返回树的根节点。每个操作 operations[i] [height, inde…...

c++基础知识-图论进阶

一、拓扑排序 1、基础知识 1)什么是拓扑排序 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若,则u在线性序列中出现在v之前。 2)拓扑排序的操作方法 重复执行…...

[Java实战]Spring Boot服务CPU 100%问题排查:从定位到解决

Spring Boot服务CPU 100%问题排查:从定位到解决 1. 引言 当Spring Boot服务出现CPU占用率100%时,系统性能会急剧下降,甚至导致服务不可用。本文将通过真实代码案例,详细讲解如何快速定位问题根源,并提供解决方案。无…...

1.6 极限存在准则

1.夹逼定理(迫敛定理) 1.1 数列型 1.1.1 准则 1.2 函数型 2. 两个重要极限...

Fisher信息、梯度方差与学习率调度器的计算流程

Fisher信息、梯度方差与学习率调度器的计算流程 目录 Fisher信息、梯度方差与学习率调度器的计算流程**步骤1:定义模型与数据集****步骤2:计算梯度与Fisher信息****步骤3:计算梯度方差****步骤4:定义学习率调度器****步骤5:参数更新流程****示例输出****关键概念说明**步骤…...

Model Context Protocol 的生命周期

生命周期阶段 生命周期分为三个主要阶段: 初始化阶段 (Initialization) 客户端与服务器建立协议版本兼容性。交换并协商能力。分享实现细节。客户端必须发送 initialize 请求,包含支持的协议版本、客户端能力和客户端实现信息。服务器必须响应其自身能力…...

Go语言中的错误处理与异常恢复:性能对比与实践思考

Gone是一款轻量级Go依赖注入框架,通过简洁的标签声明实现自动组件管理。它提供零侵入设计、完整生命周期控制和极低运行时开销,让开发者专注于业务逻辑而非依赖关系处理。 项目地址: https://github.com/gone-io/gone 文章目录 Go的错误处理哲…...

CSS 属性选择器详解

CSS 属性选择器详解 引言 CSS(层叠样式表)是网页设计中的重要组成部分,它用于控制网页元素的样式和布局。属性选择器是CSS选择器的一种,它允许开发者根据元素的特定属性来选择和样式化元素。本文将详细讲解CSS属性选择器的概念、语法以及常用属性选择器的使用方法。 一、…...

大华SDK协议在智联视频超融合平台中的接入方法

一. 大华SDK协议详解 (一)、大华SDK协议概述 大华SDK(Software Development Kit)协议是大华股份为开发者提供的一套软件开发工具包,旨在帮助开发者快速集成大华设备(如摄像头、NVR、DVR等)的功…...

卓越的用户体验需要智能内容

摘要:这篇文章指出静态文档已无法满足现代用户的需求,而智能内容则是构建卓越用户体验的关键。文章从智能内容的定义、优势和实际应用等方面进行了详细阐述,并强调了企业应积极拥抱智能内容,以提升客户满意度、降低成本并创造新的…...

【蓝桥杯】1124修建公路1(Kruskal算法)

思路 找到能够连通所有城市的最小树即可,可用Prim或Kruscal。 !!注意,m的范围是包括0的,可就是包含没有道路的情况,要单独输出0 code import os import sys# 输入 n,m map(int,input().split()) road …...

传感云揭秘:边缘计算的革新力量

在当今快速发展的科技时代,传感云和边缘计算系统正逐渐成为人们关注的焦点。传感云作为物联网与云计算的结合体,通过虚拟化技术将物理节点转化为多个服务节点,为用户提供高效、便捷的服务。而边缘计算则是一种靠近数据源头或物端的网络边缘侧…...

Bigemap Pro 的三种地图下载方式

地图下载通常是是最基础但也最重要的任务之一,无论是进行空间分析、制作专题地图,还是进行数据可视化,高质量的地图数据都是不可或缺的。Bigemap Pro提供了三种地图下载方式,分别适用于不同的场景和需求。无论是免费版用户还是专业…...

Python直方图:从核密度估计到高维空间解析

一、直方图的核心原理与数学本质 数据分布的视觉解码器 直方图(Histogram)是数据科学家的"分布显微镜",通过将连续数据划分为等宽区间(Bin),统计各区间的频数/频率,用相邻矩形条直观…...

0基础 | 恒流源专题

目录 tip1:低端反馈​编辑 tip2: 恒流源电路的设计注意事项 tip3:三极管输出恒定电流受运放输出电流控制 tip4:高端反馈 基本逻辑: 当负端Vref不输入电压时, 当负端Vref输入电压时 tip1:低端反馈 判…...

Cannl 数据同步-ES篇

Cannl 数据同步 目录 Cannl 数据同步一、概述1、简介2、原理3、模块 二、配置MySQL1、使用版本使用版本 2、环境要求1)操作系统2)MySQL要求 三、配置Canal-server1、下载安装2、**修改配置****单机配置****集群配置****分库分表配置** 四、配置canal-ada…...

Webpack 前端性能优化全攻略

文章目录 1. 性能优化全景图1.1 优化维度概览1.2 优化效果指标 2. 构建速度优化2.1 缓存策略2.2 并行处理2.3 减少构建范围 3. 输出质量优化3.1 代码分割3.2 Tree Shaking3.3 压缩优化 4. 运行时性能优化4.1 懒加载4.2 预加载4.3 资源优化 5. 高级优化策略5.1 持久化缓存5.2 模…...

时间序列分析的军火库:AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS解析

引言:时间序列分析的现代挑战 时间序列分析在多个领域中扮演着关键角色,包括工程、金融、气象、工业预测等。随着开源工具的快速发展,开发者可以通过多种库快速实现时间序列预测与分析。本文将对 AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS 六大主流库进行详细解析,…...

MySQL意向锁我该怎么理解?

在MySQL中,意向锁(Intention Lock)是一种用于协调不同粒度锁(如表锁和行锁)的机制,其核心目的是在保证数据一致性的同时提高并发性能。以下是关于意向锁的详细解析: 一、意向锁的作用 意向锁的…...

Linux 操作系统简介

Linux 操作系统 Linux 是一种自由和开源的操作系统,最初由芬兰的 Linus Torvalds 在1991年创建。它是一个类 Unix 操作系统,广泛用于服务器、个人电脑和嵌入式设备。Linux 操作系统的核心是 Linux 内核,其周围构建了各种工具和应用程序&…...

前端大文件上传(分片上传)与下载

文章目录 一、问题二、思路1、选择文件2、校验文件是否符合规范3、文件切片上传4、分片上传注意点5、大文件下载 一、问题 日常业务中难免出现前端需要向后端传输大型文件的情况,这时单次的请求不能满足传输大文件的需求,就需要用到分片上传 业务需求为…...

工业领域 - 离散工业与流程工业极简理解

离散工业 离散工业是指通过组装或加工离散的零部件来生产产品 离散工业生产的是可数的、独立的产品 离散工业的每个产品通常由多个部件组成,生产过程可以分解为多个独立的步骤 离散工业生产过程主要涉及组装和加工,组装是将多个零部件组装成最终产品&…...

一个使用Python和相关深度学习库(如`PyTorch`)实现GCN(图卷积网络)与PPO(近端策略优化)强化学习模型结合的详细代码示例

以下是一个使用Python和相关深度学习库(如PyTorch)实现GCN(图卷积网络)与PPO(近端策略优化)强化学习模型结合的详细代码示例。这个示例假设你在一个图环境中进行强化学习任务。 1. 安装必要的库 确保你已…...

【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet

主页:HABUO🍁主页:HABUO 🍁YOLOv8入门改进专栏🍁 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 【YOLOv8改进系列】: 【YOLOv8】YOLOv8结构解读…...

CCF CSP 第30次(2023.05)(1_仓库规划_C++)

CCF CSP 第30次(2023.05)(1_仓库规划_C) 题目描述:输入格式:输出格式:样例输入:样例输出:样例解释:子任务:解题思路:思路一&#xff1…...

【LangChain】理论及应用实战(7):LCEL

文章目录 一、LCEL简介二、LCEL示例2.1 一个简单的示例2.2 RAG Search 三、LCEL下核心组件(PromptLLM)的实现3.1 单链结构3.2 使用Runnables来连接多链结构3.2.1 连接多链3.2.2 多链执行与结果合并3.2.3 查询SQL 3.3 自定义输出解析器 四、LCEL添加Memor…...

Leetcode 刷题笔记1 单调栈part02

leetcode 42 接雨水 本题用双指针法更为浅显易懂 双指针法: class Solution:def trap(self, height: List[int]) -> int:leftheight, rightheight [0] * len(height), [0] * len(height)ans 0leftheight[0] height[0]for i in range(1, len(height)):lefth…...

ai本地化 部署常用Ollama软件

现在用最简单的方式介绍一下 Ollama 的作用和用法: Ollama 是什么? Ollama 是一个让你能在自己电脑上免费运行大型语言模型(比如 Llama 3、Mistral 等)的工具。 相当于你本地电脑上有一个类似 ChatGPT 的 AI,但完全…...

vllm部署QwQ32B(Q4_K_M)

vllm部署QwQ32B(Q4_K_M) Ollama是一个轻量级的开源LLM推理框架,注重简单易用和本地部署,而VLLM是一个专注于高效推理的开源大型语言模型推理引擎,适合开发者在实际应用中集成和使用。两者的主要区别在于Ollama更注重为用户提供多种模型选择和…...