Guia de Implantação do Cliente Conversacional de Borda reSpeaker XVF3800 + Agora ten-framework
Objetivo: Fazer o ESP32S3 funcionar junto com o reSpeaker XVF3800 e construir um link de voz bidirecional estável e de baixa latência via Agora RTC. Código-fonte: https://github.com/Seeed-Projects/seeed-respeaker-agora-tenframework Seeed-Projects: https://github.com/Seeed-Projects/seeed-respeaker-agora-tenframework
Introdução
Neste tutorial, vamos guiá-lo para usar o Seeed XIAO ESP32-S3 com o reSpeaker XVF3800 para captura e reprodução de áudio, e usar o Agora RTC para completar a conexão de áudio em tempo real entre o dispositivo e o backend. O backend é executado como um AI Agent. O projeto fornece um método de configuração padronizado (.env / property.json), suporta implantação com um clique via Docker, autenticação dinâmica de token e provedores plugáveis (ASR/LLM/TTS podem ser substituídos conforme necessário). Ele completa automaticamente o ciclo completo de ASR → LLM → TTS e transmite a fala sintetizada de volta para o dispositivo para reprodução — oferecendo uma experiência de conversa de baixa latência de “fale uma vez, receba uma resposta”.

Escolha Seu Backend
Este guia fornece duas opções de backend. Escolha a que melhor se adapta ao seu cenário:
| Opção | Melhor para | Servidor necessário | Link |
|---|---|---|---|
| Agora Conversational AI Agent v2 (Nuvem, direto) | Configuração mais rápida / infraestrutura mínima | Não | 👉 Ir para a versão Agent v2 |
| TEN Framework (Self-hosted, ASR/LLM/TTS plugáveis) | Pipeline personalizado / troca de provedores / recursos avançados | Sim (Docker) | Você está aqui ✅ |
Tabela de Conteúdos
- Agora Assistant – Guia de Início Rápido
- Arquitetura do Sistema
- Pré-requisitos
- Atualização de Firmware
- Implantação no Lado do Servidor
- Implantação no Lado do ESP32
- Validação & Testes
- FAQ
- Referências
Agora Assistant – Guia de Início Rápido
Visão Geral da Arquitetura
- Detecção de Palavra de Ativação (Wake Word) – Monitora continuamente uma frase de ativação predefinida.
- Speech-to-Text (STT) – Converte a fala do usuário em texto usando um mecanismo de reconhecimento de fala.
- LLM com RAG – Recupera contexto relevante de um banco de dados vetorial e usa um LLM para gerar uma resposta inteligente.
- Text-to-Speech (TTS) – Converte a resposta gerada em fala natural.
Estrutura de Diretórios Principal
ai_agents/
├── esp32-client/ # XIAO ESP32-S3 edge side: capture/play audio + Agora connection + conversation interaction
├── server/ # Server side: AI Agent orchestration / LLM / ASR / TTS, etc. (works with edge side)
├── agents/ # TEN Agent examples and extensions
├── playground/ # Web frontend UI
├── .env.example # Environment variable template
├── docker-compose.yml # Docker compose file
└── Dockerfile # Docker image build file
Arquitetura do Sistema
┌─────────────────────────────────────────────────────────────────────┐
│ System Architecture │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────────────┐ │
│ │ ESP32-S3 Device │ │ AI Agent Server │ │
│ │ (Edge Side) │ │ (Backend) │ │
│ ├─────────────────┤ ├─────────────────────────┤ │
│ │ • Microphone In │ ──── Agora RTC ──→ │ • ASR Speech Recognition│ │
│ │ • Wi-Fi │ Real-time audio │ • LLM Large Language │ │
│ │ • Speaker Out │ ←── Agora RTC ──── │ • TTS Speech Synthesis │ │
│ └─────────────────┘ └─────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
Workflow:
1. ESP32-S3 connects to the network and joins an Agora channel
2. The edge side captures microphone audio and publishes it to Agora
3. The server receives audio and runs the ASR → LLM → TTS pipeline
4. The backend sends response audio back; the device plays it, enabling real-time voice conversation
Pré-requisitos
Requisitos de Hardware
| Hardware | Observações |
|---|---|
| Seeed Studio XIAO ESP32-S3 | Placa controladora principal |
| ReSpeaker XVF3800 | Placa de expansão de áudio (matriz de microfones + interface para alto-falante) |
| Alto-falante | Pelo menos um alto-falante para reproduzir as respostas de IA |
| Cabo de dados USB-C | Para gravar o firmware e alimentar o dispositivo |

Contas & Chaves de API
Antes da implantação, você precisa se registrar e obter chaves de API para os seguintes serviços:
🔹 Agora – Obrigatório
- Visite https://console.agora.io/
- Crie uma conta gratuita
- Crie um novo projeto
- Copie o App ID e o App Certificate
🔹 Deepgram (ASR) – Obrigatório
- Visite https://console.deepgram.com/
- Crie uma conta gratuita (há cota gratuita disponível)
- Vá para a página de API Keys
- Crie uma nova API key
🔹 OpenAI (LLM) – Obrigatório
- Visite https://platform.openai.com/
- Crie uma conta e adicione um método de pagamento
- Vá para a página de API Keys
- Crie uma nova secret key
🔹 Cartesia (TTS) – Obrigatório
- Visite https://cartesia.ai/sonic
- Crie uma conta gratuita (há cota gratuita disponível)
- Vá para API Key → New API Key
- Copie a API key
Requisitos de Software
| Software | Versão | Finalidade |
|---|---|---|
| Docker Desktop | Mais recente | Implantação de servidor em contêiner |
| Git | Mais recente | Clonar o repositório |
| ESP-IDF | v5.2.3 | Framework de desenvolvimento para ESP32 |
| ESP-ADF | v2.7 | Framework de desenvolvimento de áudio para ESP32 |
Atualização de Firmware
Para obter a melhor experiência de reprodução, recomendamos atualizar o firmware XMOS para a versão mais recente.
Baixar Firmware
Você pode baixar o firmware a partir daqui.
Etapas de Atualização
No seu computador, conecte o ReSpeaker XMOS XVF3800 com XIAO ESP32S3 e execute a ferramenta de atualização de firmware, depois selecione o firmware.
Para um guia detalhado, consulte esta página。
A atualização de firmware é uma etapa obrigatória e é fortemente recomendada para obter a melhor experiência de áudio e estabilidade.
Implantação no Lado do Servidor
Implantação no Windows (Recomendado)
Etapa A: Instalar e Configurar o Docker Desktop (apenas na primeira vez)
-
Baixe e instale o Docker Desktop
Visite https://www.docker.com/products/docker-desktop/ para baixar e instalar.
-
Opções de instalação
- Marque Use WSL 2 instead of Hyper-V (se disponível)
-
Verifique a instalação
- Abra o Docker Desktop após a instalação
- Aguarde até que o ícone da bandeja mostre Docker is running
-
(Recomendado) Ativar Integração com WSL
- Docker Desktop →
Settings→Resources→WSL Integration - Ative a sua distribuição WSL mais utilizada (por exemplo, Ubuntu)
- Docker Desktop →
Etapa B: Clonar o repositório e configurar variáveis de ambiente
-
Abra o PowerShell ou Windows Terminal
-
Clone o repositório
git clone https://github.com/Seeed-Projects/seeed-respeaker-agora-tenframework.git
cd esp32-client-agora/ai_agents -
Copie o template de ambiente
PowerShell:
Copy-Item .env.example .envCMD:
copy .env.example .env -
Edite o arquivo
.enve preencha suas chaves de APIAbra
.envcom o Notepad ou VS Code e atualize os campos principais:# ==============================
# Agora RTC (Required)
# ==============================
AGORA_APP_ID=your_agora_app_id
AGORA_APP_CERTIFICATE=your_agora_app_certificate
# ==============================
# Deepgram ASR (Required)
# ==============================
DEEPGRAM_API_KEY=your_deepgram_api_key
# ==============================
# OpenAI LLM (Required)
# ==============================
OPENAI_API_KEY=your_openai_api_key
OPENAI_MODEL=gpt-4o
OPENAI_PROXY_URL= # Optional: set if you need a proxy
# ==============================
# Cartesia TTS (Required)
# ==============================
Cartesia_TTS_KEY=your_cartesia_api_key
# ==============================
# Server config (usually no changes needed)
# ==============================
LOG_PATH=/tmp/ten_agent
LOG_STDOUT=true
GRAPH_DESIGNER_SERVER_PORT=49483
SERVER_PORT=8080
WORKERS_MAX=100
Etapa C: Iniciar os serviços Docker
docker compose up -d
Verificar o status dos containers (opcional):
docker compose ps
Você deverá ver uma saída semelhante a:
NAME STATUS PORTS
ten_agent_dev running 0.0.0.0:3000->3000/tcp, 0.0.0.0:49483->49483/tcp
Etapa D: Entrar no container e executar o exemplo
-
Entrar no container
docker exec -it ten_agent_dev bash -
Instalar e executar o exemplo de Assistente de Voz
cd agents/examples/voice-assistant
task install
task run -
Aguardar o serviço iniciar
Quando você vir logs como os abaixo, o serviço está em execução:
[INFO] Server started on port 8080
[INFO] Waiting for connections...
Etapa E: Verificar os serviços
- Servidor de API: http://localhost:8080
- Interface Frontend: http://localhost:3000
- TMAN Designer: http://localhost:49483
Comandos comuns
# View container logs
docker compose logs -f
# Stop services
docker compose down
# Restart services
docker compose restart
# Full cleanup (including volumes)
docker compose down -v
Implantação em Linux/Mac
Etapa 1: Instalar o Docker
Ubuntu/Debian:
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
# Log out and log back in to take effect
macOS:
# Install Docker Desktop via Homebrew
brew install --cask docker
# Then launch the Docker Desktop app
Etapa 2: Clonar e configurar
git clone https://github.com/zhannn668/esp32-client-agora.git
cd esp32-client-agora/ai_agents
cp .env.example .env
Etapa 3: Editar variáveis de ambiente
nano .env
# or use vim
vim .env
Preencha suas chaves de API (consulte a seção do Windows acima).
Etapa 4: Iniciar os serviços
docker compose up -d
docker exec -it ten_agent_dev bash
cd agents/examples/voice-assistant
task install
task run
Implantação no lado ESP32
Configuração do Ambiente de Desenvolvimento
Instalar ESP-IDF (v5.2.3)
Windows
-
Baixar o instalador offline do ESP-IDF v5.2.3
https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.3/esp32/get-started/windows-setup.html
-
Executar o instalador
- Escolha um caminho de instalação (padrão recomendado:
C:\Espressif) - Após a instalação, um atalho “ESP-IDF 5.2 PowerShell” aparecerá no menu Iniciar
- Escolha um caminho de instalação (padrão recomendado:
-
Verificar a instalação
Abra “ESP-IDF 5.2 PowerShell” e execute:
idf.py --version
Linux
# Create an install directory
mkdir -p ~/esp
cd ~/esp
# Clone ESP-IDF
git clone -b v5.2.3 --recursive https://github.com/espressif/esp-idf.git
# Install toolchain
cd esp-idf
./install.sh esp32s3
# Configure environment variables (add to ~/.bashrc)
echo 'alias get_idf=". $HOME/esp/esp-idf/export.sh"' >> ~/.bashrc
source ~/.bashrc
Instalar ESP-ADF (v2.7)
Windows
-
Clonar ESP-ADF
No ESP-IDF PowerShell:
cd C:\Espressif\frameworks
git clone --recursive https://github.com/espressif/esp-adf.git
cd esp-adf
git checkout v2.7
git submodule update --init --recursive -
Definir a variável de ambiente ADF_PATH
Opção 1: Configurações do sistema
- Abra “Propriedades do Sistema” → “Avançado” → “Variáveis de Ambiente”
- Crie uma nova variável de usuário:
ADF_PATH=C:\Espressif\frameworks\esp-adf
Opção 2: Linha de comando
setx ADF_PATH "C:\Espressif\frameworks\esp-adf"Importante: Reinicie o ESP-IDF PowerShell após defini-la.
Linux
cd ~/esp
git clone --recursive https://github.com/espressif/esp-adf.git
cd esp-adf
git checkout v2.7
git submodule update --init --recursive
# Add env var
echo 'export ADF_PATH=$HOME/esp/esp-adf' >> ~/.bashrc
source ~/.bashrc
Aplicar o Patch do IDF
O ESP-ADF exige aplicar um patch de FreeRTOS ao ESP-IDF:
cd $IDF_PATH
git apply $ADF_PATH/idf_patches/idf_v5.2_freertos.patch
Modificar a Configuração de Pinos de Placa do ESP-ADF (Crítico!)
Como o pinout do ReSpeaker XVF3800 é diferente do Korvo-2 V3 padrão, você deve modificar a configuração de placa do framework:
Localização do arquivo:
- Windows:
C:\Espressif\frameworks\esp-adf\components\audio_board\esp32_s3_korvo2_v3\board_pins_config.c - Linux/Mac:
$ADF_PATH/components/audio_board/esp32_s3_korvo2_v3/board_pins_config.c
- Este arquivo está no diretório do framework ESP-ADF, não no diretório do seu projeto.
- As alterações afetarão todos os projetos que usam esta configuração de placa.
- É recomendável fazer backup do arquivo original primeiro:
cp board_pins_config.c board_pins_config.c.backup
Atualizar pinos I2C – Encontre get_i2c_pins() e altere para:
esp_err_t get_i2c_pins(i2c_port_t port, i2c_config_t *i2c_config)
{
// ReSpeaker XVF3800 I2C configuration
i2c_config->sda_io_num = GPIO_NUM_5; // ReSpeaker I2C SDA
i2c_config->scl_io_num = GPIO_NUM_6; // ReSpeaker I2C SCL
return ESP_OK;
}
Atualizar pinos I2S – Encontre get_i2s_pins() e altere para:
esp_err_t get_i2s_pins(int port, board_i2s_pin_t *i2s_config)
{
// ReSpeaker XVF3800 I2S configuration
i2s_config->bck_io_num = GPIO_NUM_8; // BCLK
i2s_config->ws_io_num = GPIO_NUM_7; // WS/LRCK
i2s_config->data_out_num = GPIO_NUM_44; // DOUT
i2s_config->data_in_num = GPIO_NUM_43; // DIN
i2s_config->mck_io_num = -1; // Disable MCLK
return ESP_OK;
}
Baixar o Agora IoT SDK
-
Baixar o SDK
-
Extrair no diretório components
cd esp32-client-agora/ai_agents/esp32-client/components
tar -xvf agora_iot_sdk.tar
Inicializar o submódulo esp32-camera
cd esp32-client-agora
git submodule update --init --recursive
Compilar & Gravar
Configurar parâmetros do Agente de IA
Edite ai_agents/esp32-client/main/app_config.h. Se você usar um IP de LAN, certifique-se de que o ESP32 e o servidor estejam na mesma LAN; se usar um IP público, você pode ignorar isso.
#pragma once
// ==============================
// AI Agent server configuration
// ==============================
// Change to your Server IP (the computer running Docker)
#define TENAI_AGENT_URL "http://192.168.x.x:8080"
// ==============================
// Agent graph selection
// ==============================
#define CONFIG_GRAPH_OPENAI // Use OpenAI graph
// ==============================
// Greeting and prompt
// ==============================
#define GREETING "Can I help You?"
#define PROMPT ""
// ==============================
// Graph configuration
// ==============================
#if defined(CONFIG_GRAPH_OPENAI)
#define GRAPH_NAME "voice_assistant"
#define V2V_MODEL "gpt-realtime"
#define LANGUAGE "en-US"
#define VOICE "ash"
#endif
// ==============================
// Agent identity configuration
// ==============================
#define AI_AGENT_NAME "tenai0125-11"
#define AI_AGENT_CHANNEL_NAME "test_channel_12345" // Channel name
#define AI_AGENT_USER_ID 12345 // User ID
// ==============================
// Audio codec configuration
// ==============================
#define CONFIG_USE_G711U_CODEC
// ==============================
// Agora App ID
// ==============================
#define AGORA_APP_ID "your_agora_app_id"
Compilar firmware
-
Abrir o terminal ESP-IDF
- Windows: “ESP-IDF 5.2 PowerShell”
- Linux/Mac: execute
get_idf
-
Entrar no diretório do projeto
cd esp32-client-agora/ai_agents/esp32-client -
Definir o chip de destino
idf.py set-target esp32s3 -
Configurar Wi-Fi e FreeRTOS
idf.py menuconfigConfigure os seguintes itens:
-
Configuração de Wi-Fi:
Agora Demo for ESP32 --->
(your WiFi SSID) WiFi SSID
(your WiFi password) WiFi Password -
Habilitar compatibilidade retroativa do FreeRTOS:
Component config --->
FreeRTOS --->
Kernel --->
[*] configENABLE_BACKWARD_COMPATIBILITY
-
-
Compilar
idf.py buildEm caso de sucesso, você verá:
Project build complete. To flash, run:
idf.py flash
Gravar firmware
-
Conectar a placa
- Conecte o XIAO ESP32-S3 ao seu computador via cabo USB-C
-
Identificar a porta serial
- Windows: Gerenciador de Dispositivos → Portas, encontre a porta COM (por exemplo, COM3)
- Linux: geralmente
/dev/ttyUSB0ou/dev/ttyACM0 - macOS: geralmente
/dev/cu.usbmodem*
-
Gravar e monitorar
# Windows
idf.py -p COM3 flash monitor
# Linux/Mac
idf.py -p /dev/ttyUSB0 flash monitorProblema de permissão no Linux: se você vir “permission denied”, execute:
sudo usermod -aG dialout $USER
# then log out and log back in -
Indicação de gravação bem-sucedida
Ver logs como os abaixo indica sucesso:
Hard resetting via RTS pin...
Connecting...
Validação & Testes
Verificar logs de boot do ESP32
Quando ele iniciar com sucesso, a saída serial deverá incluir estes logs principais:
I (xxxx) wifi: connected with YourWiFi, aid = 1
got ip: 192.168.x.x
~~~~~Initializing AIC3104 Codec~~~~
W (xxxx) AIC3104_NG: Found device at address 0x18
AIC3104 detected, page register = 0x00
~~~~~AIC3104 Codec initialized successfully~~~~
I (xxxx) AUDIO_PIPELINE: Pipeline started
~~~~~agora_rtc_join_channel success~~~~
Agora: Press [SET] key to join the Ai Agent ...
Lista de Verificação de Sucesso
| Item | Significado |
|---|---|
WiFi connected | Wi-Fi conectado com sucesso |
got ip: xxx.xxx.xxx.xxx | Endereço IP obtido |
Found device at address 0x18 | AIC3104 detectado |
AIC3104 Codec initialized successfully | Codec inicializado com sucesso |
agora_rtc_join_channel success | Canal RTC acessado com sucesso |
Execute um teste de conversa por voz
- Pressione o botão SET na placa para iniciar o Agente de IA
- Fale no microfone
- Observe os logs seriais; você deve ver logs de envio/recebimento de áudio
- O alto-falante reproduz a resposta da IA
Perguntas frequentes (FAQ)
Problemas do lado do servidor
P1: Contêineres Docker não iniciam
R: Verifique o seguinte:
- Certifique-se de que o Docker Desktop está em execução
- Verifique se a porta já está em uso:
netstat -an | grep 8080 - Veja logs detalhados:
docker compose logs
P: Comando task não encontrado após entrar no contêiner
R: Certifique-se de que está usando a imagem correta. Execute docker compose pull para atualizar a imagem.
Problemas do lado do ESP32
P2: Erro de compilação i2c driver install error
R: Conflito de driver I2C. Certifique-se de que o código usa a API I2C legada (driver/i2c.h) em vez da nova (driver/i2c_master.h).
P: Tempo limite de I2C em tempo de execução ESP_ERR_TIMEOUT
R: Possíveis causas:
- Problema de fiação de hardware – verifique as linhas/cabos I2C
- Configuração de pinos incorreta – verifique se
board_pins_config.cfoi atualizado corretamente - Endereço I2C incorreto – verifique o endereço detectado nos logs
Logs de depuração:
W (xxxx) AIC3104_NG: Scanning I2C bus...
W (xxxx) AIC3104_NG: Found device at address 0x??
Se o endereço não for 0x18, você precisa alterar AIC3104_ADDR em aic3104_ng.h.
P: Sem saída de áudio
R: Verifique:
- Se o AIC3104 inicializa com sucesso (verifique os logs seriais)
- Se os pinos I2S estão configurados corretamente
- Se o alto-falante está conectado corretamente
P: Erro de buffer de rede Not enough space
R: Este é um problema de rede em tempo de execução e geralmente pode ser ignorado temporariamente:
- Verifique a qualidade da rede
- Reduza a taxa de bits do áudio
- Aumente o tamanho do buffer de rede
P: Ainda há erros após modificar board_pins_config.c
R:
- Confirme se você editou o caminho de arquivo correto
- Execute
idf.py fullcleanpara uma limpeza completa - Reconstrua com
idf.py build
Referências
Documentação oficial
| Recurso | Link |
|---|---|
| Guia de Programação ESP-IDF | https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.3/esp32s3/ |
| Guia de Programação ESP-ADF | https://docs.espressif.com/projects/esp-adf/zh_CN/latest/ |
| Documentação do Agora RTC | https://docs.agora.io/en/rtc/overview/product-overview |
| Documentação do TEN Framework | https://doc.theten.ai |
| Guia de Firmware do ReSpeaker XVF3800 | https://wiki.seeedstudio.com/cn/respeaker_xvf3800_introduction/ |
Serviços de API
| Serviço | Console |
|---|---|
| Agora | https://console.agora.io/ |
| Deepgram | https://console.deepgram.com/ |
| OpenAI | https://platform.openai.com/ |
| ElevenLabs | https://elevenlabs.io/ |
Folhas de dados dos chips
| Datasheet | Link |
|---|---|
| Datasheet TI AIC3104 | https://www.ti.com/product/TLV320AIC3104 |
| Wiki do XIAO ESP32-S3 | https://wiki.seeedstudio.com/pt-br/xiao_esp32s3_getting_started/ |
Repositórios do projeto
| Repositório | Link |
|---|---|
| TEN Framework | https://github.com/TEN-framework/ten-framework |
| ESP32 Client Agora | https://github.com/zhannn668/esp32-client-agora |
Suporte técnico e discussão sobre o produto
Obrigado por escolher nosso produto! Estamos aqui para fornecer suporte e tornar sua experiência o mais tranquila possível. Oferecemos vários canais de comunicação para atender diferentes preferências e necessidades.