今天作者帶大家實現一個普通配置電腦即可運行的私有化ChatGPT,支持以下功能:
1.界面體驗與ChatGPT官方幾乎一樣。
2.支持多種開源模型,可以聊天、寫代碼、識別圖片內容等。
3.支持文生圖。
4.支持麥克風語音輸入聊天。
5.支持自動朗讀回答結果。
6.支持聯網使用openai。
1.界面:open webui,8.1k star,界面漂亮,功能豐富,我們本次主要用它將其他各開源項目組合起來。
2.大模型:ollama,44.8k star,支持使用CPU運行多種開源大模型,部署超級簡單。
3.文生圖:stable diffusion,124k star,最強開源文生圖項目。
4.語音輸入:openai開源的whisper, 57.1k star,CPU可用,效果可與收費產品比肩。
5.文本朗讀:windows系統提供的接口,離線免費使用,后面有介紹。
6.接入openai:GPT_API_free, 13.3k star,免費的openai API key。
下面只有前兩步為必須執行的,后面步驟根據自己需求決定是否執行。
參考上篇文章43.7k star! 輕松在本地運行Llama2、Gemma等多種大模型,無需GPU!完成第一步操作即可,ollama支持多種優秀開源大模型,可根據需求多下載幾種,按需使用,官方支持的模型:https://ollama.com/library
open webui不僅是一個聊天界面,還是一個ollama的客戶端,還有很多其他功能,感興趣可以去github看官方文檔。使用docker一鍵部署:
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
安裝完成之后,瀏覽器輸入http://localhost:3000,選擇模型就可以開始聊天了。可以到設置界面的General中設置各種模型參數,到這一步已經實現一個基本的私有化ChatGPT了。
先使用ollama下載llava模型,聊天時選擇llava,發送圖片即可。以下是作者測試的圖片識別效果,連后面有多排座位,有些座位是空的都能準確識別出來!
如果想使用語音輸入功能,可以參考這篇文章部署whisper:54.3k star! 用openai開源的whisper部署自己的語音識別系統。部署好之后,將STT引擎改為whisper(Local),在聊天輸入框就可以點擊麥克風圖標輸入語音了。
先本地部署stable diffusion(以下簡稱sd):AI繪畫教程之stable diffusion【2.Windows系統本地部署】
說明:sd需要GPU,但我看sd官方文檔好像支持CPU,作者未驗證。
接下來坑比較多,作者已解決,照做即可。
set COMMANDLINE_ARGS=--api
如圖所示:
[id^='setting_'] > div[style*='position: absolute'] {
display: none !important;
}
5.3 雙擊webui.bat啟動sd,進入open-webui的設置頁面,按下圖設置,注意:因為open-webui是在docker部署的,sd是在宿主機部署,open-webui調用sd接口相當于docker內部調用宿主機服務,所以在瀏覽器雖然用127.0.0.1:7860能訪問sd,但是這里填寫127.0.0.1是無法請求的,按圖示內容填寫,如果您的部署方式和作者不一樣,請根據情況填寫。
5.4 生成圖片的按鈕只在大模型回復的內容下面才會出現,并且會把回復的內容當成sd的prompt,因此想生成圖片需要先選擇一個模型,讓模型把你想使用的promt回復給你,然后點擊生成圖片按鈕,就可以生成了。
感覺本地模型運行慢,有時候想用在線的OpenAI接口?沒問題!可以參照這篇獲取免費的API Key:13k star! 獲取免費ChatGPT API Key的開源項目,親測可用!然后按照下圖配置。
配置后,模型選擇列表中就會自動多出來幾個openai模型,選擇即可使用。
按下圖設置即可開啟朗讀功能,聊天時收到完整響應后會自動朗讀。
關于文本朗讀的實現原理,前幾天寫了一篇免費使用TTS的文章:2.8k star! 用開源免費的edge-tts平替科大訊飛的語音合成服務,作者以為這個也應該是調用了某個在線的TTS服務,但是在console中看不到任何關于TTS的請求,后來查看源碼才發現是用HTML5的Speech Synthesis API實現的,這個API可以調用Windows系統的TTS。以下是代碼,可直接在瀏覽器的console中運行測試。
// 獲取支持的聲音列表
speechSynthesis.getVoices()
// 合成并播放語音
const speak = new SpeechSynthesisUtterance('要播放的文字');
// 選擇用哪個聲音
speak.voice = speechSynthesis.getVoices()[0];
// 執行這句就可以聽到聲音了
speechSynthesis.speak(speak);
以下是測試截圖:
利用這個API可以實現免費、離線的TTS功能。