這次的編寫鐵人賽文章的過程,一位會友跟我介紹了這個文字轉語音的模組,並傳來令人驚豔的展示影片:
心想:
因此我們就來反找文中的影片是利用哪個 MicroPython 的模組與使用哪一個文字轉語音的模組來實現。
我們是利用這個關鍵字 Awesome MicroPython 搜尋,找到這個內容豐富的套件整理網站:
然後在分類 Text-to-Speech 這個位置,找到了一個名叫 micropython-SYN6988 的專案,點選進去,發現專案的介紹影片就是朋友傳來的這張。
我們來先來讀讀專案裡的說明,研究這個晶片到底要怎麼使用:
說明檔裡面有附一張硬體說明的照片:
作者是這樣陳述的:
SYN6988 是幾種語音合成器/文本轉語音器之一 (TTS) 模組在全球速賣通和其他市場上價格低廉 供應商。這令人印象深刻,因為:
* 它產生清晰的英語語音,而不求助於音素;
* 它有一個線路輸出/耳機插孔和小揚聲器輸出,兩者都是 具有非常乾淨的音訊;
* 它很容易通過異步串行或 SPI(此處未嘗試後者);
* 它在音量、音調和語速上有一定的靈活性;
* 它內置了一個大型的警報音庫;
* 它不貴,約為 🇨🇦 15 美元。
接腳圖:
SYN6988 MicroPython Board Raspberry Pi Pico
========= =================== ===================
RDY Digital Input GPIO 2
RXD UART TXD GPIO 0 (UART 0 TX)
TXD UART RXD GPIO 1 (UART 0 RX)
GND Ground Any GND pin
3V3 3V3 supply 3V3(OUT)
根據 MicroPython 的官方文件:
https://docs.micropython.org/en/latest/esp32/quickref.html
我們不能使用 UART0 ,因為 MicroPython RPEL 的環境已經先佔用了。
我們從接腳圖著手
SYN6988 MicroPython Board WiFiBoy Python 玩學機
========= =================== ===================
RDY Digital Input GPIO 2
RXD UART TXD GPIO 5 (UART 2 TX)
TXD UART RXD GPIO21 (UART 2 RX)
GND Ground GND(WBIO 2)
3V3 3V3 supply 3V3(OUT) (WBIO 3)
SYN6988 中英文語音合成晶片是 宇音天下 公司 2020 年推出的產品。官網連結為 http://www.voicetx.com/product/detail.html?id=11,憑藉著模組價格優勢(約兩百元台幣左右),很受市場歡迎。像是醫院叫號、智慧停車、工廠廣播的應用場景都可看到這個產品。
因為這模組是文字轉語音的晶片,可接受傳入GBK 或是 Unicode 字串,就能產生相對應的中英文語音。但因為不同語言的聲調、中英文與數字混合時有不同的發音、語調與語速。因此,要讓系統發音能夠接近真人,就需要針對傳入的字串做一些標記處理。開發者文件最重要的部份也是這個章節。一般使用者知道如何控制傳入的字串,就能很輕鬆地使用 WiFiBoy Python 玩學機為自己家裡或是公司,做一個資訊語音裝置,甚至要它幫您讀報也可以。
重要的幾個參數有:
英文語音相關設定
實例說明:
[n2]有123公斤重。[d]
讀做「有一百二十三公斤重」。[v5]歡迎參加[v8]2024 ITHome鐵人賽[v2],WiFiBoy 歡迎您![d]
將 micropython-SYN6988 專案整個下載,解壓縮專案檔,裡面有一個 syn6988.py,將這個 py 檔上傳到玩學機 Flash 的 lib 目錄下即可。
請參考我們的範例教學:
import time
import machine
import lib.syn6988
# WiFiBoy 接腳
# GND ---> GND
# 3V3 ---> 3V3
# IO2 ---> RDY
# IO5 ---> TX
# IO21 ---> RX
### setup device
ser = machine.UART(
2, baudrate=9600, bits=8, parity=None, stop=1, tx=5, rx=21
)
busyPin = machine.Pin(21, machine.Pin.IN, machine.Pin.PULL_UP)
s = lib.syn6988.SYN6988(ser, busyPin)
def speak_and_spell(r):
# print then speak string r
s.speak(r)
return s
str = "0912-345678 來電"
speak_and_spell(str)
str2 = "[g1]2024-08-20 10:36:28"
speak_and_spell(str2)
str3 = "[x1]sound112[m3][g1][v6][n2][i1][y1][f0][b1]2024 ITHome 鐵人賽完賽!"
speak_and_spell(str3)
speak_and_spell(
"[g2]Hello! WiFiBoy[g1]你好![g2]" ) # language selection with [g*]
speak_and_spell("I can speak in English, and also in Chinese:")
speak_and_spell("[g1]千里之行,始於足下。[g2]")
speak_and_spell(
"which means: a journey of five hundred kilometres starts with the first step")