国产电影一区二区三区,,欧美大片免费观看,伊人久久大香线蕉av,国产日韩成人内射视频

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖
  • 論壇首頁
  • 電源技術綜合區
  • 【DigiKey年度寵粉】基于(yu)ESP32的DIY語音智能交互(hu)機器人:從選配到(dao)實(shi)現的全程記錄

【DigiKey年度寵粉】基于ESP32的DIY語音智能交互機器人:從選配到實現的全程記錄

作為一名電子愛好者和創客,我一直對智能語音交互技術充滿興趣。最近,我決定基于ESP32開發板,DIY一個語音智能交互機器人。這次項目不僅讓我深入了解了語音識別和交互技術下面,我將詳細分享我的開發過程以及最終成果。

其中 感謝 瑾sing 大佬的指點與幫助

一、項目規劃

1. 項目目標

我的目標是制作一個能夠通過語音指令交互的智能機器人,具備以下功能:

語音識別:通過麥克風采集語音并轉換為文本。

語音反饋:通過喇叭播放語音回復。

顯示交互信息:通過TFT屏幕顯示當前狀態和交互內容。

2. 所需元件

為了實現上述功能,我選擇了以下核心元件:

2.1 ESP32開發板:作為主控芯片,負責處理語音識別、交互邏輯和驅動外設。

2.2 1.8寸TFT彩屏(ST7735驅動):用于顯示交互信息和狀態。

2.3 MAX98357音頻放大器:驅動喇叭播放語音反饋。

2.4 INMP441全向麥克風模塊:用于高精度語音采集。

2.5 3W喇叭:播放語音回復。

二、元件展示

1. ESP32開發板ESP32是一款功能強大的Wi-Fi和藍牙雙模芯片,非常適合物聯網和智能交互項目。它的引腳豐富,支持多種外設接口。

2. 1.8寸TFT彩屏(ST7735驅動)這款屏幕分辨率高,色彩鮮艷,適合顯示交互信息。它的SPI接口與ESP32兼容,接線簡單。

3. MAX98357音頻放大器MAX98357是一款高效的I2S數字音頻放大器,可以直接驅動3W喇叭,音質清晰。

4. INMP441全向麥克風模塊INMP441是一款高性能的數字麥克風,支持I2S接口,能夠高精度采集語音信號。

5. 3W喇叭這款喇叭體積小巧,但音量大,適合嵌入式項目。

三、API選擇與注冊

1. KIMI AI模(mo)型API

KIMI是一(yi)款強大的AI模型,支持自然語言(yan)處理(li)和對(dui)話生成。通過其API,我可(ke)以實現智能對(dui)話功(gong)能。

官網

請求方式:POST

功能:發送用戶(hu)輸(shu)入的文(wen)本,獲(huo)取(qu)AI生成的回復。

2. 百度智能(neng)云(yun)語音服務

百(bai)度(du)智(zhi)能(neng)云提供了語(yu)音識別和語(yu)音合成(cheng)服(fu)務,非常適(shi)合用于語(yu)音交互項目。

官網

語音識別:POST請求(qiu),將語音文(wen)件(jian)轉換為文(wen)本。

語音合成:GET請求(qiu),將文(wen)本轉換為語音文(wen)件。

四、API調試工具推薦:Postman

Postman是一(yi)款非(fei)常流(liu)行的API調試工具,支(zhi)持多種請求方(fang)式(GET、POST等),并且可以方(fang)便(bian)地(di)查(cha)看請求和響應(ying)數據(ju)。以下是使用Postman調試API的基本步驟:

下載并安裝Postman:。

創建一個新的(de)請(qing)求,選擇(ze)請(qing)求方式(GET或POST)。

填寫API的URL、請(qing)求頭和(he)請(qing)求體。

發送請(qing)求并查看響應結果。

五、、在ESP32中集成API調用

String get_kimi(String question)
{
HTTPClient http1 ;
http1.setTimeout(20000);
http1.begin(Kimi_url);
http1.addHeader("Content-Type", "application/json");
http1.addHeader("Authorization", "sk-4cyiL5............................................................."); //注意得填寫你的碼
 String body="{\"model\":\"moonshot-v1-8k\",\"messages\":[{\"role\":\"system\",\"content\":\"你是我的AI助手小愛,你必須用中文回答且字數不超過85個\"},{\"role\":\"user\",\"content\":\"" + question + "\"},{\"role\": \"assistant\",\"name\":\" 小南\", \"content\":\"\", \"partial\": true}],\"temperature\":0.3}";

int httpResponseCode = http1.POST(body);
  if(httpResponseCode == 200)
  {
    String response = http1.getString();
    http1.end();
    //Serial.println(response);
    StaticJsonDocument<1024> json1;
    deserializeJson(json1,response);
    String json_get1 = json1["choices"];
     deserializeJson(json1,json_get1);
    String message = json1[0]["message"].as<String>();
     deserializeJson(json1,message);
     String respone = json1["content"];
    //Serial.println(respone);
    return respone ;
  }
  else
  {
    http1.end();
    //Serial.println("error");
    return "你問的太快了詢問不能頻繁當前為一分鐘三到四次詢問)";//(kimi的api比較菜一分鐘只能問他3個問題)
  }
}

void callBaiduTextToSpeech(String text) {
    HTTPClient http;
    String url = "//tsn.baidu.com/text2audio?tex=" + text + "&tok=YOUR_ACCESS_TOKEN&cuid=YOUR_DEVICE_ID&ctp=1&lan=zh";
    http.begin(url);

    int httpResponseCode = http.GET();

    if (httpResponseCode == 200) {
        // 保存語音文件并播放
        File file = SPIFFS.open("/output.mp3", FILE_WRITE);
        http.writeToStream(&file);
        file.close();
        playAudio("/output.mp3");
    } else {
        Serial.println("Error calling Baidu Text-to-Speech API");
    }
    http.end();
}

六、語音數據采集

1. 使用driver/i2s.h庫與INMP441麥克風

INMP441是一款高性能的數字麥克風,支持I2S接口。為了采集語音數據,我使用了ESP32的driver/i2s.h庫。以(yi)下是具(ju)體(ti)實現步驟(zou):

1.1 初始化I2S

#include <driver/i2s.h>

void setupI2S() {
    i2s_config_t i2s_config = {
        .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
        .sample_rate = 8000,
        .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
        .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
        .communication_format = I2S_COMM_FORMAT_STAND_I2S,
        .intr_alloc_flags = 0,
        .dma_buf_count = 8,
        .dma_buf_len = 64,
        .use_apll = false
    };

    i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
    i2s_set_pin(I2S_NUM_0, NULL);
}

1.2 采集語音數據

由于driver/i2s.h庫是(shi)雙聲(sheng)道(dao)設(she)計,而INMP441是(shi)單聲(sheng)道(dao)麥克風,因此(ci)采集到的數據(ju)只(zhi)有左聲(sheng)道(dao)有效,右聲(sheng)道(dao)數據(ju)為0。為了解(jie)決這個問(wen)題,我(wo)采用了以下兩種方法:

方法1:增加數據量

將采(cai)樣(yang)數據(ju)量(liang)增(zeng)加到(dao)兩倍(例如3200個數據(ju)),這樣(yang)可以確(que)保(bao)采(cai)集(ji)到(dao)足夠的有效數據(ju),但會浪費資源。

方(fang)法2:設置兩倍(bei)長(chang)度的數組

在接口函數中填入兩倍(bei)長(chang)度(du)的(de)數組,確保采(cai)集到足夠的(de)有效(xiao)數據(ju)。

void captureAudio(int16_t* buffer, size_t bufferSize) {
    size_t bytesRead;
    i2s_read(I2S_NUM_0, buffer, bufferSize * 2, &bytesRead, portMAX_DELAY);
}

2、數據上傳

2.1. 編碼為(wei)Base64

百度智(zhi)能(neng)云(yun)的語音識別API要(yao)求上傳的音頻(pin)數據必須為Base64編碼。以下(xia)是編碼實(shi)現的代碼:

#include <base64.h>

String encodeAudioToBase64(int16_t* audioData, size_t dataSize) {
    size_t encodedSize = Base64.encodedLength(dataSize * 2);
    char encodedData[encodedSize];
    Base64.encode((uint8_t*)audioData, dataSize * 2, encodedData);
    return String(encodedData);
}

2. 上傳音頻數據

以(yi)下是上傳(chuan)音頻數據到百度智能云的代碼:

#include <WiFi.h>
#include <HTTPClient.h>

void uploadAudioToBaidu(String base64Data) {
    HTTPClient http;
    http.begin("//vop.baidu.com/server_api");
    http.addHeader("Content-Type", "application/json");

    String requestBody = "{\"format\":\"wav\",\"rate\":16000,\"channel\":1,\"token\":\"YOUR_ACCESS_TOKEN\",\"cuid\":\"YOUR_DEVICE_ID\",\"speech\":\"" + base64Data + "\"}";
    int httpResponseCode = http.POST(requestBody);

    if (httpResponseCode == 200) {
        String response = http.getString();
        Serial.println("Baidu Speech Recognition: " + response);
    } else {
        Serial.println("Error calling Baidu Speech Recognition API");
    }
    http.end();
}

七、文字轉語音

1. 使用audio.h庫播放MP3

百度智能云的語音合成API返回的是MP3格式的音頻文件,我使用了audio.h庫來(lai)播放這(zhe)些文(wen)件。以下是實(shi)現(xian)代碼:

#include <Audio.h>

Audio audio;

void playTextToSpeech(String text) {
    String url = "//tsn.baidu.com/text2audio?tex=" + text + "&tok=YOUR_ACCESS_TOKEN&cuid=YOUR_DEVICE_ID&ctp=1&lan=zh";
    audio.connecttohost(url.c_str());
}

void loop() {
    audio.loop();
}

八、硬件連接與引腳配置

1. MAX98357音頻放大(da)器(qi)(語音輸出)

MAX98357是一款I2S數字音(yin)頻放大(da)器,用于驅動喇叭(ba)播放語(yu)音(yin)。以下是其接(jie)線方法:

I2S_DOUT:連接(jie)到ESP32的GPIO 25(數據(ju)輸出)。

I2S_BCLK:連接到(dao)ESP32的(de)GPIO 27(位時鐘)。

I2S_LRC:連(lian)接到ESP32的GPIO 26(左右聲道(dao)時鐘)。

喇叭:連接到(dao)MAX98357的喇叭(ba)輸(shu)出端子(正(zheng)負極不分)。

#define I2S_DOUT 25 #define I2S_BCLK 27 #define I2S_LRC 26

2. INMP441麥克(ke)風(語音輸入(ru))

INMP441是(shi)一款(kuan)高性(xing)能的數字麥(mai)克風,用于采集語音(yin)信號。以下(xia)是(shi)其接(jie)線方法(fa):

I2S_WS:連接到ESP32的GPIO 32(字選擇(ze))。

I2S_SD:連接到ESP32的(de)GPIO 35(數據(ju)輸入)。

I2S_SCK:連接到ESP32的GPIO 33(串行時鐘)。

L/R:接(jie)地(選擇左聲道)。

#define I2S_WS        32
#define I2S_SD        35
#define I2S_SCK       33

3. TFT屏幕(顯示交(jiao)互信息(xi))

TFT屏幕用(yong)于顯示語音(yin)交互信息和系統(tong)狀態。以(yi)下是其接線方法:

TFT_MOSI:連接到ESP32的GPIO 2(主輸(shu)出(chu)從輸(shu)入)。

TFT_SCLK:連(lian)接到(dao)ESP32的GPIO 15(串行(xing)時(shi)鐘)。

TFT_CS:連接到ESP32的GPIO 17(片(pian)選)。

TFT_DC:連接到ESP32的GPIO 16(數據/命令選擇)。

TFT_RST:連(lian)接到ESP32的GPIO 4(復位)。

#define TFT_MOSI      2
#define TFT_SCLK      15
#define TFT_CS        17
#define TFT_DC        16
#define TFT_RST       4

4. LED(狀態指示)

LED用于指示系統(tong)狀態。以(yi)下是其接線(xian)方法(fa):

LED正極:連接到ESP32的(de)GPIO 21。

LED負極:接地。

#define ledPin        21

5. 按鍵(用戶輸入)

按鍵用(yong)于(yu)用(yong)戶輸入(ru)操作(zuo)。以(yi)下是其接(jie)線(xian)方(fang)法:

按鍵引腳:連接到ESP32的GPIO 18。

按鍵另一端:接地。

上拉電阻:在GPIO 18和3.3V之間(jian)接(jie)一個10kΩ的(de)上拉電阻。

#define keyPin        18

八、硬件連接圖

以下是(shi)硬件連接的(de)示意圖:

ESP32 GPIO 25 (I2S_DOUT)  -> MAX98357 DIN
ESP32 GPIO 27 (I2S_BCLK)  -> MAX98357 BCLK
ESP32 GPIO 26 (I2S_LRC)   -> MAX98357 LRC
MAX98357 SPK+/-           -> 喇叭

ESP32 GPIO 32 (I2S_WS)    -> INMP441 WS
ESP32 GPIO 35 (I2S_SD)    -> INMP441 SD
ESP32 GPIO 33 (I2S_SCK)   -> INMP441 SCK
INMP441 L/R               -> GND

ESP32 GPIO 2 (TFT_MOSI)   -> TFT MOSI
ESP32 GPIO 15 (TFT_SCLK)  -> TFT SCK
ESP32 GPIO 17 (TFT_CS)    -> TFT CS
ESP32 GPIO 16 (TFT_DC)    -> TFT DC
ESP32 GPIO 4 (TFT_RST)    -> TFT RST

ESP32 GPIO 21 (ledPin)    -> LED正極
LED負極                   -> GND

ESP32 GPIO 18 (keyPin)    -> 按鍵引腳
按鍵另一端                -> GND
ESP32 GPIO 18             -> 10kΩ上拉電阻 -> 3.3V

九、開始測試

1. 硬件準備

確保以下硬件已正確連接:

ESP32開發板:主控芯片。

MAX98357音頻放大器:連(lian)接喇(la)叭(ba),用于語音輸出。

INMP441麥克風:用于語音輸入。

TFT屏幕:顯示交互信息。

LED:用于狀態指示。

按鍵:用(yong)于觸(chu)發語音輸入。

2. 上電啟動

將ESP32開(kai)發板連接到(dao)電源,系(xi)統會(hui)自動啟動并初始化所有硬件。TFT屏幕會(hui)顯示歡迎信息,LED會(hui)亮起(qi)表(biao)示系(xi)統已(yi)就緒(xu)。

十、交互流程

1. 按住(zhu)按鈕開(kai)始說話

操作:按(an)住按(an)鍵(jian)(GPIO 18)。

提示:TFT屏(ping)幕會顯示“聆聽中...&rdquo;,LED會閃爍表示正(zheng)在錄音。

錄音:系統通(tong)過INMP441麥克風采集(ji)語音數據。

2. 釋放按鈕結束錄音(yin)

操作:釋放按鍵。

提示:TFT屏幕會顯示(shi)&ldquo;思考中...&rdquo;,LED保持(chi)常(chang)亮。

處理:系統(tong)將采(cai)集到(dao)的(de)語音數據上傳(chuan)至(zhi)百度智能云進(jin)行語音識別(bie)。

3. 獲取語音(yin)識別結果

操作:等待系統處理。

提示:TFT屏幕會(hui)顯示識(shi)別結果(例如“你(ni)說:你(ni)好”)。

處理:系(xi)統將識別結果發(fa)送至KIMI API,獲(huo)取AI生(sheng)成的回(hui)復。

4. 播放語音回復

操作:系統自動播放(fang)語音回復。

提示:TFT屏幕會顯示回(hui)復內容(例如(ru)“回(hui)復:你好,我是智(zhi)能機器人!”)。

播放:通過MAX98357音(yin)頻放大器驅動喇叭播放語(yu)音(yin)回復。

視頻展示:

全部回復(0)
正序查看
倒序查看
現在還沒有回復呢,說說你的想法