打造智能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中导入:

  1. 打开PyCharm → File → Settings → Project → Python Interpreter
  2. 点击齿轮图标 → Add → Existing environment → 选择刚才创建的虚拟环境路径下的Python解释器
  3. 安装必要插件:Pylint(代码检查)、Black(代码格式化)

2. 硬件终端开发环境

打造智能ai语音助手:项目规划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"<