基于ChatGPT制作的一款英语口语练习应用SpokenAi
本文介紹了一款基于ChatGPT的英語口語練習應用SpokenAi,包括PortAudio的安裝流程和核心代碼,以及語音合成TextToSpeech的實現。同時提供了配置文件和部署運行示例。 --由ChatGPT總結生成
一.前言
Hi,大家好,我是Baird。最近幾個月大火大熱的ChatGPT已經發布到ChatGPT4版本了,我也一直在關注ChatGPT的發展,一直在思考能基于ChatGPT或著說openai的能力能做出點什么應用,解決一些問題。
💥在仔細看過openai的API文檔后,發現openai不止提供了Chat的能力,還提供了如語音轉文字,圖片生成等能力。雖然沒有ChatGPT那么火,但經過一番試用后,發現和ChatGPT效果一樣讓人驚艷。索性就直接來一個openai全家桶,通過openai的能力開發一款應用試試。
開發什么呢? 🤔
ChatGPT對英語的語言能力自然不必說,而我們國人當下英語學習面臨的一大問題就是啞巴英語,市面上的提供的英語對話機器人和ChatGPT比起來差得不是一星半點。只能請老師一對一真人教學? 🤨 拜托,現在都2023年了,還需要花錢請口語老師么?
來造一款Ai口語練習應用解決這個問題 💯
ChatGPT4是由OpenAI開發的自然語言處理模型,采用了大規模無監督學習的方式進行訓練,可用于生成文本、回答問題和聊天等任務。OpenAI是人工智能領域的一家公司,其API文檔提供了多種功能,包括語音轉文字、圖片生成等。
二.需求清單
首選先列出我們需求清單,這個是一個簡單版本的英語口語練習功能,先不打算造一個大app,我們只需要解決如下問題
基于上述功能,第一期我打算先做一個終端版本的應用-SpokenAi,看看后續發展再考慮做一個Web或APP版本的程序 (實際上是缺人手缺時間 🤧)
三.系統架構
來,先設計一下我們SpokenAi的系統架構
- portaudio: PortAudio是一個跨平臺的音頻I/O庫,提供了簡單的API,使得開發人員可以在不同的平臺上以相似的方式訪問音頻硬件。它支持Windows、Mac OS X、Linux和其他主要的操作系統。PortAudio支持多種音頻API,包括ASIO、Core Audio、DirectSound、MME / WDM、ALSA和OSS。PortAudio還包括一個流接口,允許開發人員以相同的方式使用不同的音頻API和硬件。
- openai-api: 提供了多種API服務,包括但不限于自然語言處理、語音轉文字、文字轉語音、圖像生成等。在OpenAI的API文檔中,用戶可以申請API密鑰,并使用API進行開發和測試。
- tensorflowtts: TensorflowTTS 是一個基于 TensorFlow 的語音合成工具包,它包含了多種語音合成模型和前處理工具,并且支持多種語音合成任務,例如有人聲合成(Vocoder)、語音轉換、語音增強等。它可以幫助開發者快速搭建語音合成模型,定制自己的語音合成系統。
- Docker: Docker是一種容器化技術,可以將應用程序及其依賴項打包在一個容器中,以便在任何地方運行。容器是一種輕量級的虛擬化技術,可以提供與傳統虛擬機相似的隔離性和安全性,但占用的資源更少。Docker還提供了一套工具和平臺,使得容器的構建、部署和管理變得更加容易。
- SpokenAi:整體應用層,其中有三個庫分別是praudio、rocket、ttsclient,對應如下作用
- praudio: 封裝portaudio,對外提供音頻錄制和音頻播放等接口
- rocket: 封裝openai-api, 對外提供Chat接口、音頻轉文字等接口
- ttsclient: 提供調用容器化運行的tensorflowtts的接口
- Console: 終端交互層,用戶按提示進行操作,輸入信息和進行相關操作
Tips:tensorflowtts 依賴較多,為方便完整,這里采用Docker部署
四.流程設計
接下來,我們設計一下交互流程
簡單概括總體流程有三個步驟,一是輸入個人信息 二是錄音轉文字,三是發送消息,進行對話交互
由于是通過終端訪問,主要監聽鍵盤事件,進行不同操作
如 按W鍵會開始錄音,錄音過程中按Q停止錄音,待錄音翻譯完成后,按Ctrl+shift+enter發送消息
五.開發細節
編程語言: Go 1.6+
SpokenAi使用依賴于portaudio,需要提前安裝好portaudio否則編譯無法通過
PortAudio
一.PortAudio下載地址:
Mac和Linux比較好安裝,Windows只能源碼編譯安裝,具體流程如下:
PortAudio Window 安裝流程
PortAudio Window DLLs 安裝流程
除此之外,可以直接選擇網上編譯好的庫,可以從這里https://github.com/spatialaudio/portaudio-binaries下載。
在后續編譯鏈接過程中,還是需要安裝gcc, 推薦安裝MinGW-w64。
安裝完成MinGW后,將下載PortAudio庫文件libportaudio-x86_64-w64-mingw32.static.dll 更名成portaudio.dll,放到MinGW ld能搜索到的庫路徑。
將PortAudio庫文件libportaudio-x86_64-w64-mingw32.static.dll 放到Window System32目錄下,在運行時程序需要找到該動態庫
調用PortAudio的核心代碼
主要實現功能有:
- 支持開始錄音和停止錄音
- 最長錄制60s的音頻,到時取消
2.播放音頻
// PlayWavFile 播放指定的WAV文件 func PlayWavFile(filename string) error {// 打開WAV文件f, err := os.Open(filename)if err != nil {return fmt.Errorf("failed to open WAV file: %v", err)}defer f.Close()// 解碼WAV文件s, format, err := wav.Decode(f)if err != nil {return fmt.Errorf("failed to decode WAV file: %v", err)}defer s.Close()// 初始化揚聲器err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))if err != nil {return fmt.Errorf("failed to initialize speaker: %v", err)}// 播放音頻done := make(chan struct{})speaker.Play(beep.Seq(s, beep.Callback(func() {close(done)})))// 等待音頻播放完成<-donereturn nil }語音合成TextToSpeech
目前比較通用的TextToSpeech(TTS)方案有以下幾種:
- Google Cloud Text-to-Speech
- Amazon Polly
- Microsoft Azure Text-to-Speech
- IBM Watson Text to Speech
- Mozilla TTS
- Tacotron 2
- WaveNet
- TensorFlowTTS
有簡單調用云服務的,也有自己安裝環境的。調用云服務需要注冊賬號,按量收費,比較費錢 🙂。決定自己部署,采用TensorFlowTTS,通過構建Docker容器運行該服務。
Dockerfile如下,第一次構建速度會比較慢。
FROM tensorflow/tensorflow:2.6.0# 安裝必要的依賴 RUN apt-get update &&\apt-get install -y libsndfile1# 安裝TensorFlowTTS RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ TensorFlowTTS flask# 安裝 RUN apt-get install -y git RUN pip install git+https://github.com/repodiac/german_transliterate.git#egg=german_transliterate RUN pip install --upgrade numpy numba# 安裝 ADD tts-server-api.py /app/tts-server-api.py# 運行REST API服務器 CMD python /app/tts-server-api.py --host 0.0.0.0 --port 5000如果不想自己自定義,可以直接下載我構建好的服務
docker pull ptonlix/tensorflowtts:1.0.9 docker run -itd -p 5000:5000 --name spokenai-tts ptonlix/tensorflowtts:1.0.9tts-server-api.py 是啟動Flask的API服務的腳本,對外提供/api/tts 文字轉語音接口
@app.route('/api/tts', methods=['POST']) def tts():data = request.get_json()text = data['text']# fastspeech inferenceinput_ids = processor.text_to_sequence(text)mel_before, mel_after, duration_outputs, _, _ = fastspeech2.inference(input_ids=tf.expand_dims(tf.convert_to_tensor(input_ids, dtype=tf.int32), 0),speaker_ids=tf.convert_to_tensor([0], dtype=tf.int32),speed_ratios=tf.convert_to_tensor([1.0], dtype=tf.float32),f0_ratios=tf.convert_to_tensor([1.0], dtype=tf.float32),energy_ratios=tf.convert_to_tensor([1.0], dtype=tf.float32),)# melgan inferenceaudio_before = mb_melgan.inference(mel_before)[0, :, 0]audio_after = mb_melgan.inference(mel_after)[0, :, 0]# save to file# Convert audio data to byte streambuffer = io.BytesIO()sf.write(buffer, audio_after, 22050, format='WAV', subtype='PCM_16')audio_bytes = buffer.getvalue()# Return audio data as a response with MIME type audio/wavreturn Response(audio_bytes, mimetype='audio/wav')解決完上述兩個關鍵問題,剩下就是業務代碼的編寫
配置文件
[openai][openai.base]apikey = ""apihost = "https://api.openai.com/v1" [openai.chat]chatmodel = "gpt-3.5-turbo"chatmaxtoken = 2048chattemperature = 0.7chattopp = 1[openai.audio]audiomodel = "whisper-1"[file][file.history]path = "./data/history/"[file.audio][file.audio.record]path = "./data/audio/record/"[file.audio.play]path = "./data/audio/play/"enable = 0ttshost = "http://127.0.0.1:5000"采用toml配置文件格式, 主要分為兩部分
- history為聊天上下文存儲
- audio為音頻存儲
- record為錄音文件存儲目錄
- play為語言合成文件存儲目錄
- enable 可以選為是否開啟語音合成,默認不開啟,開啟需要運行tensorflowtts。
- ttshost 為tts api服務地址
六.部署運行
🚀項目地址:https://github.com/ptonlix/spokenai
🌟歡迎Star 、PR 、 Issue 、交流
編譯運行
安裝portaudio, 參考上節PortAudio流程
# 下載源碼 git clone https://github.com/ptonlix/spokenai.git cd spokenai# 修改配置文件 edit fat_config.toml# 編譯 go build# 查看命令 ./spokenai -h# 運行 ./spokenai運行示例
windows啟動:
Mac啟動:
開始對話:
后續計劃
- 尋找志同道合的小伙伴,有意向一起制作一款Ai應用的請聯系我!!!
- 修復Bug,目前發現mac上語音播放一定概率播放失敗
- 編碼后端服務和客戶端程序
總結
以上是生活随笔為你收集整理的基于ChatGPT制作的一款英语口语练习应用SpokenAi的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【程序包uti1不存在怎么办?】求解答
- 下一篇: RN综合演练,仿美团电商(谢谢你的STA