| 最近用ESP做大模型终端很流行,我们有个小群一些人也一直在摸索。 在实现大模型终端之前,准备先做对讲机。
 今天这个教程就算半个对讲机吧。大家加个按钮控制,改成双向的应该就可以了。
 声明:本教程代码由多个人使用多个大模型生成修改整合。
 
 硬件:esp32一块,K10一块,麦克风模块INMP441一块,导线若干
 编程环境:thonny,语言:micropython
 固件:ESP32和ESP32S3标准固件(K10没用DF官方固件)
 
 esp32接线图:
 
 
   
 ESP32作为发射端,K10作为接收端(还不会用K10的麦克风)
 发送端代码:
 
 接收端代码:wifi_manager.py复制代码from machine import I2S, Pin
import network
import socket
import time
# Network Configuration
SSID = 'waoo2111280'
PASSWORD = 'waoo2111280'
SERVER_IP = '192.168.22.198'
SERVER_PORT = 12345
# I2S Configuration
SCK_PIN = 23  # Serial clock output
WS_PIN = 22   # Word clock output
SD_PIN = 21   # Serial data output
# Audio Configuration
SAMPLE_RATE = 16000
SAMPLE_BITS = 16     # Changed to 16-bit for better compatibility
CHANNELS = 1         # Mono channel
BUFFER_LENGTH = 2048 # Increased buffer size for better performance
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('Connecting to WiFi...')
        wlan.connect(SSID, PASSWORD)
        while not wlan.isconnected():
            time.sleep(1)
    print('WiFi Connected')
    print('IP Address:', wlan.ifconfig()[0])
def init_audio():
    audio_in = I2S(
        0,                      
        sck=Pin(SCK_PIN),
        ws=Pin(WS_PIN), 
        sd=Pin(SD_PIN),
        mode=I2S.RX,           
        bits=SAMPLE_BITS,      
        format=I2S.MONO,       # Changed to mono for simplicity
        rate=SAMPLE_RATE,      
        ibuf=BUFFER_LENGTH * 2 # Double buffer size
    )
    return audio_in
def main():
    connect_wifi()
    audio = init_audio()
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    audio_buf = bytearray(BUFFER_LENGTH)
    
    print('Starting audio capture and transmission...')
    
    try:
        while True:
            # Read audio data
            num_read = audio.readinto(audio_buf)
            if num_read > 0:
                # Send data in smaller chunks to prevent packet loss
                chunk_size = 1024
                for i in range(0, num_read, chunk_size):
                    chunk = audio_buf[i:min(i + chunk_size, num_read)]
                    sock.sendto(chunk, (SERVER_IP, SERVER_PORT))
            time.sleep_ms(1)
                
    except Exception as e:
        print('Error:', e)
    finally:
        audio.deinit()
        sock.close()
if __name__ == '__main__':
    main()
 
 audio_output.py复制代码"""WiFi connection management"""
import network
import time
def connect_wifi(ssid, password):
    """Connect to WiFi network"""
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    
    if not wlan.isconnected():
        print('Connecting to WiFi...')
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            time.sleep(1)
    
    print('Connected to WiFi')
    print('IP:', wlan.ifconfig()[0])
    return wlan
 config.py复制代码"""Audio output handling using I2S and MAX98357A"""
from machine import I2S, Pin
class AudioOutput:
    def __init__(self, bclk_pin, ws_pin, data_pin, sample_rate, bits):
        """Initialize I2S output for MAX98357A"""
        self.audio_out = I2S(
            1,                          # I2S ID (0 or 1)
            sck=Pin(bclk_pin),         # Bit clock
            ws=Pin(ws_pin),            # Word select
            sd=Pin(data_pin),          # Data
            mode=I2S.TX,               # Transmit mode
            bits=bits,                 # Sample size
            format=I2S.MONO,           # Mono format
            rate=sample_rate,          # Sample rate
            ibuf=10000                 # Internal buffer size
        )
    
    def write(self, audio_data):
        """Write audio data to I2S DAC"""
        self.audio_out.write(audio_data)
    
    def deinit(self):
        """Clean up I2S resources"""
        self.audio_out.deinit()
 
 main.py复制代码"""Configuration settings for the audio receiver"""
# Network settings
WIFI_SSID = 'waoo2111280'
WIFI_PASSWORD = 'waoo2111280'
UDP_PORT = 12345
'''
# I2S pins for MAX98357A
BCLK_PIN = 26  # Bit clock
WS_PIN = 25    # Word select / Left-right clock
DATA_PIN = 22  # Data pin
'''
# 初始化引脚定义
BCLK_PIN = 0 # 串行时钟输出
WS_PIN  = 38  # 字时钟
DATA_PIN  = 45  # 串行数据输出
# Audio settings
SAMPLE_RATE = 16000
BITS_PER_SAMPLE = 16
BUFFER_SIZE = 1024
 
 修改wifi账号密码,把两端各自的代码上传到板子上,运行,先运行接收端,获得IP地址填入发送端代码。复制代码"""Main program for ESP32 audio receiver"""
import socket
from config import *
from wifi_manager import connect_wifi
from audio_output import AudioOutput
def main():
    # Connect to WiFi
    connect_wifi(WIFI_SSID, WIFI_PASSWORD)
    
    # Initialize audio output
    audio = AudioOutput(
        bclk_pin=BCLK_PIN,
        ws_pin=WS_PIN,
        data_pin=DATA_PIN,
        sample_rate=SAMPLE_RATE,
        bits=BITS_PER_SAMPLE
    )
    
    # Setup UDP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('0.0.0.0', UDP_PORT))
    print(f'Listening on port {UDP_PORT}')
    
    try:
        while True:
            try:
                # Receive audio data
                data, addr = sock.recvfrom(BUFFER_SIZE)
                # Play audio through MAX98357A
                audio.write(data)
            except Exception as e:
                print('Error:', e)
    
    finally:
        audio.deinit()
        sock.close()
if __name__ == '__main__':
    main()
 
  
  
  视频
 
 
 
 |