基于ESP32的文本到語(yǔ)音(TTS)轉(zhuǎn)換web服務(wù)器
掃描二維碼
隨時(shí)隨地手機(jī)看文章
文本轉(zhuǎn)語(yǔ)音(TTS)技術(shù)已被廣泛應(yīng)用于語(yǔ)音助手、廣播、自動(dòng)取款機(jī)等領(lǐng)域。它也被用來(lái)幫助兒童學(xué)習(xí)說(shuō)話和盲人交流。今天我們將使用ESP32來(lái)構(gòu)建一個(gè)TTS(文本到語(yǔ)音)引擎,它可以將任何數(shù)字轉(zhuǎn)換為語(yǔ)音。號(hào)碼將從網(wǎng)頁(yè)輸入,語(yǔ)音將從ESP32附帶的揚(yáng)聲器生成。也可以查看其他基于ESP32的物聯(lián)網(wǎng)項(xiàng)目。
所需的組件
?ESP32單片機(jī)
?一個(gè)演講者
?一種放大電路
?穩(wěn)壓電源
?連接電線
線路圖
我們可以通過(guò)將揚(yáng)聲器連接到ESP32直接驅(qū)動(dòng)揚(yáng)聲器,但聲音會(huì)有很多噪音。因此,這里使用放大器電路來(lái)獲得清晰響亮的聲音。這里使用的是基于LM386的放大電路,其電路圖如下:
這個(gè)電路圖取自這個(gè)鏈接LM386基于音頻放大器電路,通過(guò)這個(gè)鏈接了解更多關(guān)于這個(gè)放大器的功能。
連接揚(yáng)聲器到ESP32
完成上述放大電路后,將ESP32連接到放大電路上,如下圖所示。ESP32的數(shù)字引腳25連接到10K電阻,ESP32的地連接到放大電路的地。
ESP32文本到語(yǔ)音的編程
使用ESP32將文本轉(zhuǎn)換為語(yǔ)音的編程部分很簡(jiǎn)單。完整的代碼和演示視頻在本教程的最后給出。
首先,我們必須安裝一個(gè)名為T(mén)alkie的庫(kù),它可以從這里下載。然后通過(guò)Sketch->Include Library-> add . zip Library將其添加到Arduino IDE中。
然后通過(guò)包含所有必需的庫(kù)開(kāi)始編寫(xiě)代碼?!癢ifi.h”、“WifiClient.h”用于創(chuàng)建客戶端,通過(guò)Wi-Fi連接到ISP。WebServer.h用于創(chuàng)建web服務(wù)器,espmdn .h用于本地mDNS請(qǐng)求。
接下來(lái)為T(mén)alkie定義對(duì)象語(yǔ)音。
在下一部分中,我們將定義數(shù)字(即1、2、3等)。你也可以添加更多的單詞/音素,通過(guò)記錄每個(gè)聲音并將其轉(zhuǎn)換為十六進(jìn)制代碼。有各種軟件可用于將它們轉(zhuǎn)換為十六進(jìn)制,如二進(jìn)制查看器。
現(xiàn)在定義一個(gè)函數(shù),它可以輸出-999,999到999,999之間的任何數(shù)字。這個(gè)函數(shù)可以在Talkie庫(kù)中找到。這個(gè)函數(shù)使用簡(jiǎn)單的邏輯。首先,它會(huì)檢查數(shù)字是否為負(fù),如果是負(fù)的,它會(huì)在說(shuō)出單詞之前加上一個(gè)“-”。如果它是零,那么它說(shuō)的是零。
然后它檢查這個(gè)數(shù)字是否大于或等于千,這樣它就可以在輸入之前附加“千”。然后,它通過(guò)將數(shù)字除以1000來(lái)檢查余數(shù),以告訴1000之后的數(shù)字。同樣的邏輯用于百位數(shù)或三位數(shù)。
現(xiàn)在設(shè)置Wi-Fi。在代碼中輸入替換Wi-Fi的名稱和密碼。因?yàn)槲覀兪褂玫氖荋TTP協(xié)議,所以我們?cè)趕erver()函數(shù)中輸入80。因?yàn)?0是HTTP的默認(rèn)端口號(hào)。
現(xiàn)在定義一個(gè)數(shù)組htmlResponse來(lái)獲取來(lái)自網(wǎng)頁(yè)的輸入。
接下來(lái)定義一個(gè)函數(shù)handleRoot()來(lái)創(chuàng)建一個(gè)html頁(yè)面。snprintf()函數(shù)用于生成其中編碼的html頁(yè)面?,F(xiàn)在,通過(guò)將htmlResponse數(shù)組及其大小傳遞給它,開(kāi)始對(duì)html頁(yè)面進(jìn)行編碼。首先給標(biāo)題命名為“文本到語(yǔ)音”。然后在HTML中創(chuàng)建文本框和按鈕。
接下來(lái)編寫(xiě)JavaScript代碼。首先為我們正在獲取的輸入定義一個(gè)變量Number,然后將文本框中輸入的值賦給Number。最后將網(wǎng)頁(yè)發(fā)送到服務(wù)器。
在下一部分中定義一個(gè)函數(shù)handleSave()。這里我們把字符串轉(zhuǎn)換成整型,因?yàn)槲覀兊玫降妮斎胧且粋€(gè)字符串,為了把它說(shuō)出來(lái),我們必須把它作為整型來(lái)使用。
現(xiàn)在在setup()函數(shù)中,首先,我們將數(shù)字引腳25定義為輸出并保持高電平。然后使用Wifi.begin()函數(shù)初始化Wi-Fi,并打印一些狀態(tài)信息。然后在接下來(lái)的幾行中,我們通過(guò)調(diào)用handleRoot()函數(shù)啟動(dòng)服務(wù)器,并通過(guò)調(diào)用handleSave()函數(shù)從web頁(yè)面獲取輸入,最后打印消息“HTTP服務(wù)器已啟動(dòng)”。
文本到語(yǔ)音轉(zhuǎn)換使用ESP32通過(guò)網(wǎng)頁(yè)
最后使用Arduino IDE將代碼上傳到ESP32并運(yùn)行。打開(kāi)串口監(jiān)視器,復(fù)制串口監(jiān)視器顯示的IP地址,如下圖所示。
網(wǎng)頁(yè)看起來(lái)是這樣的:
輸入任意號(hào)碼,點(diǎn)擊“說(shuō)話”按鈕,系統(tǒng)就會(huì)說(shuō)出該號(hào)碼。
這就是ESP32如何將文本轉(zhuǎn)換為語(yǔ)音,這個(gè)網(wǎng)頁(yè)可以在世界任何地方通過(guò)轉(zhuǎn)發(fā)Wi-Fi路由器的端口打開(kāi)。
本文編譯自iotdesignpro