打造智能ai语音助手:项目大纲
引言
各位开发者们好!今天给大家带来一篇AI智能语音助手实战教程,我们将从零开始,一步步打造一个拥有语音交互能力的AI小智系统。整个项目涵盖后端Python开发和ESP32硬件终端开发,无论你是后端开发者还是嵌入式爱好者,都能从中获益。这个系统不仅能与大语言模型对话,还能实现物联网控制功能,真正做到"听得懂、看得见、能行动"的智能助手。
一、开发环境搭建
1. 后端开发环境
Python虚拟环境配置
# 创建虚拟环境
python -m venv ai_assistant_env
# 激活虚拟环境(Windows)
ai_assistant_env\Scripts\activate
# 激活虚拟环境(Linux/Mac)
source ai_assistant_env/bin/activate
# 安装核心依赖
pip install torch numpy websockets fastapi uvicorn
我们使用Python虚拟环境避免依赖冲突,PyTorch作为深度学习框架支持模型推理。这种方式比直接在全局环境安装更加干净,也便于项目迁移和部署。
PyCharm集成开发环境
PyCharm自带虚拟环境功能,但我们推荐使用命令行创建的虚拟环境,然后在PyCharm中导入:
- 打开PyCharm → File → Settings → Project → Python Interpreter
- 点击齿轮图标 → Add → Existing environment → 选择刚才创建的虚拟环境路径下的Python解释器
- 安装必要插件:Pylint(代码检查)、Black(代码格式化)
2. 硬件终端开发环境
ESP32开发板配置
我们选用ESP32-S3作为硬件终端,使用ESP-ADF框架进行开发:
# 安装VSCode及ESP-IDF插件
# 初始化ESP-ADF项目
idf.py create-project ai_assistant
cd ai_assistant
idf.py set-target esp32s3
C++开发配置
虽然ESP32支持C语言开发,但我们使用C++进行面向对象编程,提高代码结构性:
// ESP32 基础类示例
class AudioDevice {
protected:
int sample_rate;
int channels;
public:
AudioDevice(int sr, int ch) : sample_rate(sr), channels(ch) {
}
virtual bool start() = 0; // 纯虚函数,需要子类实现
virtual void stop() = 0;
};
// 麦克风类继承音频设备类
class Microphone : public AudioDevice {
private:
i2s_config_t i2s_config;
public:
Microphone(int sr) : AudioDevice(sr, 1) {
// 初始化I2S配置
}
bool start() override {
// 实现麦克风启动逻辑
return true;
}
void stop() override {
// 实现麦克风停止逻辑
}
};
二、系统架构设计
1. 软件架构
系统采用前后端分离架构:
- 后端:Python服务,负责接口提供、大模型交互、语音处理
- 终端:ESP32设备,负责音频采集、播放和物联网通信
2. 硬件架构
ESP32-S3开发板集成了以下功能组件:
- 主控:ESP32-S3双核处理器,主频240MHz
- 音频输入:麦克风阵列,支持降噪
- 音频输出:集成DAC和功放,驱动扬声器
- 通信模块:WiFi/蓝牙双模
- 显示接口:触摸屏,用于交互反馈
三、基础功能实现
1. Python后端功能
大语言模型接入
import requests
import json
class LLMService:
def __init__(self, api_key):
self.api_key = api_key
self.api_url = "https://api.deepseekai.com/v1/chat/completions"
def ask(self, prompt, context=None):
"""向大语言模型发送请求并获取回答"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {
self.api_key}"
}
messages = []
if context:
messages.extend(context)
messages.append({
"role": "user", "content": prompt})
data = {
"model": "deepseek-chat",
"messages": messages,
"temperature": 0.7
}
response = requests.post(self.api_url, headers=headers, json=data)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
return f"错误: {
response.status_code}, {
response.text}"
语音合成实现
import requests
import base64
import os
class TTSService:
def __init__(self, api_key):
self.api_key = api_key
self.api_url = "https://api.tts-service.com/v1/synthesize"
def synthesize(self, text, output_file="output.mp3"):
"""将文本转换为语音并保存为MP3文件"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {
self.api_key}"
}
data = {
"text": text,
"voice": "zh-CN-XiaoxiaoNeural",
"output_format": "mp3"
}
response = requests.post(self.api_url, headers=headers, json=data)
if response.status_code == 200:
# 保存音频文件
with open(output_file, "wb") as f:
f.write(base64.b64decode(response.json()["audio_content"]))
return output_file
else:
raise Exception(f"TTS API错误: {
response.status_code}, {
response.text}")
音频编解码
import subprocess
import os
def encode_to_opus(input_file, output_file, bitrate="32k"):
"""将音频编码为Opus格式"""
cmd = [
"ffmpeg", "-i", input_file,
"-c:a", "libopus", "-b:a", bitrate,
output_file
]
subprocess.run(cmd, check=True)
def decode_from_opus(input_file, output_file):
"""将Opus音频解码为WAV格式"""
cmd = [
"ffmpeg"<
