顯示具有 python 標籤的文章。 顯示所有文章
顯示具有 python 標籤的文章。 顯示所有文章

6/17/2024

如何建構能直接語音對話的AI聊天機器人

去年(2023)chatgpt出現之後,AI的各種應用突然之間瘋狂開展。chatgpt很快推出3,4而現在又有4o,其他AI周圍的各種相關服務也爆炸性的成長。

我本來預期很快的會出現直接對話型的AI,不過多半都是以應用程式存在,而不是直接可以用瀏覽器使用。主要的技術問題都已經有既存的解決方案,所以趁著有點空閒,自己來做一個玩看看



為了方便使用,整個應用界面打算僅使用瀏覽器,在LLM上當然是直接使用chatgpt-4o。而將語音轉成文字(speech-to-text)會使用openai 的model:whisper-1。文字轉語音會先用gTTS因為它不用錢,如果覺得效果不好,在改用其他付費的Saas服務。同時,為了簡單處理server session,最好還是有第三方登入比較好,我打算就使用LINE-ID來登入。


整個技術架構非常簡單


* 在digitalocean 弄個 ubuntu TLS VM, 安裝python3, flask, ngnix,  openai sdk等等

* nginx只是負責靜態網頁,並且提供SSL層,SSL解開後就proxy到flask server

* flask server負責處理收到的聲音,先儲存成webm然後送到openai識別文字

* 識別文字之後,直接把文字送到openai chatgpt-4o模型,取得ai的文字回答

* 拿到ai文字回應之後,把文字直接送到gTTS之類的文字轉語音,取得語音之後,利用socketio傳遞data steaming直接播放到瀏覽器

* 為了容易debug 對談的文字也會顯示在web上

最後的結果會是這樣呈現

想要試看看的話可以 到這個網址 https://api.shadow-warrior.space/ 先提醒一下(1)需要使用line登入 (2) 瀏覽器需要允許使用麥克風 (3)要記得開聲音不然不會聽到 






7/18/2017

二氧化碳監測與Raspberry PI


Raspberry PI 或稱樹莓派,是最近幾年蠻有名的微型單版機電腦。最新版本(RPi 3)仍然是約略名片大小,但擁有1G RAM 加上 64bit ARMv8使它能做的事情已經和一般的PC沒有太大的不同。

這對純軟體工程師來說,是一個很容易介入IOT硬體的開始。早期,需要嵌入式系統(Embedded System)或者對各類硬體輸出入有一定了解,才能做一些有趣的應用,而現在由於RPi的關係,讓這些應用的門檻降的非常低。

因為RPi已經可以運行各類Linux Distribution,FreeBSD 甚至Windows10。讓軟體工程師可以直接撰寫有趣的應用程式,降低考慮硬體的問題。

不過,「降低」並不代表完全不需要考慮硬體問題。實際上很多市面上的硬體零件,其規格和輸出入方式各有不同,還是得有基本了解或者「取得範例」,才能達到想要的效果。

以市面上容易買到的「攀藤CO2模組」為例,它的文件相當的「精簡」,也沒有任何範例程式,因此需要自己想像一下官方文件到底在說什麼。

想跳過以下冗長說明的,可以直接看這個python範例

官方文件提及這個模組式需要用標準序列埠Serial Port連結。因此可以想像就是把Raspberry TX/RX 和這個硬體的 RX/TX對接,並且硬體需要5v的電,也要接到Raspberry的5V輸出以及接地,因此就是4, 6, 8, 10這四個pin腳。

接上之後,需要送出指令,這個模組才會運作。根據中文官方文件,你需要知道指令,以及把指令組合成7個bytes然後送出。

但是其實,這個裝置也只有一個指令,也就是0xe3,上面述的DATAH, DATAL其實是填0,而不是如同文件上「打X」。由於只有一個指令,所以校正數字當然就一定也只有一個可能。簡單的說,其實只要(而且也只能)送出以下資料到serial port即可:

[ 0x42, 0x4d, 0xe3, 0x00, 0x00, 1, 114]
#python 範例程式節錄 送出serial port
ser = serial.Serial("/dev/ttyAMA0", 9600)
init_cmd =[ 0x42, 0x4d, 0xe3, 0x00, 0x00, 1, 114]
for c in init_cmd:
     ser.write(chr(c))



上述程式在RPi中會預設serial port已經不作為TTY (終端機)使用,因此才能直接對/dev/ttyAMA0執行輸出入。由於RPi預設serial port(8,10)式作為終端機使用,因此請記得disable它,並且重開機。

接下來,根據文件的內容,需要接收(讀取)一個12個bytes的資料,資料內容也都是固定,真正有意義的是第五和第六個byte,這兩個byte應該組合成一個數字。這個裝置最好的地方在於,它的數字已經是CO2的PPM值,這比某些其他公司的裝置還需要用各種方式換算方便許多。

兩個bytes組成一個數字的方式很多,例如可以把第一個位數利用 << 位移8,然後加上第二的位數。當然也可以把第一個位數*256加上第二個位數。

#python 範例程式部分節錄
 while True:
     count = ser.inWaiting()
     if count >= 12:
         recv = ser.read(count)
         h8 = recv[4]
         l8 = recv[5]
         print(str(ord(h8)*256 + ord(l8))+" PPM,")


最終結果就是,會有個Raspberry PI可以監視並且告知附近環境的CO2含量。
在辦公室監視一整天的結果非常明顯,上班前的CO2含量比較低,人越多的時候CO2含量會快速增加。連續兩日,都是在每日下午5點到達最高峰,接下來逐漸下降至隔天開始上班為止。