基于ChatGPT制作的一款英语口语练习应用SpokenAi
本文介紹了一款基于ChatGPT的英語(yǔ)口語(yǔ)練習(xí)應(yīng)用SpokenAi,包括PortAudio的安裝流程和核心代碼,以及語(yǔ)音合成TextToSpeech的實(shí)現(xiàn)。同時(shí)提供了配置文件和部署運(yùn)行示例。 --由ChatGPT總結(jié)生成
一.前言
Hi,大家好,我是Baird。最近幾個(gè)月大火大熱的ChatGPT已經(jīng)發(fā)布到ChatGPT4版本了,我也一直在關(guān)注ChatGPT的發(fā)展,一直在思考能基于ChatGPT或著說(shuō)openai的能力能做出點(diǎn)什么應(yīng)用,解決一些問(wèn)題。
💥在仔細(xì)看過(guò)openai的API文檔后,發(fā)現(xiàn)openai不止提供了Chat的能力,還提供了如語(yǔ)音轉(zhuǎn)文字,圖片生成等能力。雖然沒(méi)有ChatGPT那么火,但經(jīng)過(guò)一番試用后,發(fā)現(xiàn)和ChatGPT效果一樣讓人驚艷。索性就直接來(lái)一個(gè)openai全家桶,通過(guò)openai的能力開(kāi)發(fā)一款應(yīng)用試試。
開(kāi)發(fā)什么呢? 🤔
ChatGPT對(duì)英語(yǔ)的語(yǔ)言能力自然不必說(shuō),而我們國(guó)人當(dāng)下英語(yǔ)學(xué)習(xí)面臨的一大問(wèn)題就是啞巴英語(yǔ),市面上的提供的英語(yǔ)對(duì)話(huà)機(jī)器人和ChatGPT比起來(lái)差得不是一星半點(diǎn)。只能請(qǐng)老師一對(duì)一真人教學(xué)? 🤨 拜托,現(xiàn)在都2023年了,還需要花錢(qián)請(qǐng)口語(yǔ)老師么?
來(lái)造一款A(yù)i口語(yǔ)練習(xí)應(yīng)用解決這個(gè)問(wèn)題 💯
ChatGPT4是由OpenAI開(kāi)發(fā)的自然語(yǔ)言處理模型,采用了大規(guī)模無(wú)監(jiān)督學(xué)習(xí)的方式進(jìn)行訓(xùn)練,可用于生成文本、回答問(wèn)題和聊天等任務(wù)。OpenAI是人工智能領(lǐng)域的一家公司,其API文檔提供了多種功能,包括語(yǔ)音轉(zhuǎn)文字、圖片生成等。
二.需求清單
首選先列出我們需求清單,這個(gè)是一個(gè)簡(jiǎn)單版本的英語(yǔ)口語(yǔ)練習(xí)功能,先不打算造一個(gè)大app,我們只需要解決如下問(wèn)題
基于上述功能,第一期我打算先做一個(gè)終端版本的應(yīng)用-SpokenAi,看看后續(xù)發(fā)展再考慮做一個(gè)Web或APP版本的程序 (實(shí)際上是缺人手缺時(shí)間 🤧)
三.系統(tǒng)架構(gòu)
來(lái),先設(shè)計(jì)一下我們SpokenAi的系統(tǒng)架構(gòu)
- portaudio: PortAudio是一個(gè)跨平臺(tái)的音頻I/O庫(kù),提供了簡(jiǎn)單的API,使得開(kāi)發(fā)人員可以在不同的平臺(tái)上以相似的方式訪(fǎng)問(wèn)音頻硬件。它支持Windows、Mac OS X、Linux和其他主要的操作系統(tǒng)。PortAudio支持多種音頻API,包括ASIO、Core Audio、DirectSound、MME / WDM、ALSA和OSS。PortAudio還包括一個(gè)流接口,允許開(kāi)發(fā)人員以相同的方式使用不同的音頻API和硬件。
- openai-api: 提供了多種API服務(wù),包括但不限于自然語(yǔ)言處理、語(yǔ)音轉(zhuǎn)文字、文字轉(zhuǎn)語(yǔ)音、圖像生成等。在OpenAI的API文檔中,用戶(hù)可以申請(qǐng)API密鑰,并使用API進(jìn)行開(kāi)發(fā)和測(cè)試。
- tensorflowtts: TensorflowTTS 是一個(gè)基于 TensorFlow 的語(yǔ)音合成工具包,它包含了多種語(yǔ)音合成模型和前處理工具,并且支持多種語(yǔ)音合成任務(wù),例如有人聲合成(Vocoder)、語(yǔ)音轉(zhuǎn)換、語(yǔ)音增強(qiáng)等。它可以幫助開(kāi)發(fā)者快速搭建語(yǔ)音合成模型,定制自己的語(yǔ)音合成系統(tǒng)。
- Docker: Docker是一種容器化技術(shù),可以將應(yīng)用程序及其依賴(lài)項(xiàng)打包在一個(gè)容器中,以便在任何地方運(yùn)行。容器是一種輕量級(jí)的虛擬化技術(shù),可以提供與傳統(tǒng)虛擬機(jī)相似的隔離性和安全性,但占用的資源更少。Docker還提供了一套工具和平臺(tái),使得容器的構(gòu)建、部署和管理變得更加容易。
- SpokenAi:整體應(yīng)用層,其中有三個(gè)庫(kù)分別是praudio、rocket、ttsclient,對(duì)應(yīng)如下作用
- praudio: 封裝portaudio,對(duì)外提供音頻錄制和音頻播放等接口
- rocket: 封裝openai-api, 對(duì)外提供Chat接口、音頻轉(zhuǎn)文字等接口
- ttsclient: 提供調(diào)用容器化運(yùn)行的tensorflowtts的接口
- Console: 終端交互層,用戶(hù)按提示進(jìn)行操作,輸入信息和進(jìn)行相關(guān)操作
Tips:tensorflowtts 依賴(lài)較多,為方便完整,這里采用Docker部署
四.流程設(shè)計(jì)
接下來(lái),我們?cè)O(shè)計(jì)一下交互流程
簡(jiǎn)單概括總體流程有三個(gè)步驟,一是輸入個(gè)人信息 二是錄音轉(zhuǎn)文字,三是發(fā)送消息,進(jìn)行對(duì)話(huà)交互
由于是通過(guò)終端訪(fǎng)問(wèn),主要監(jiān)聽(tīng)鍵盤(pán)事件,進(jìn)行不同操作
如 按W鍵會(huì)開(kāi)始錄音,錄音過(guò)程中按Q停止錄音,待錄音翻譯完成后,按Ctrl+shift+enter發(fā)送消息
五.開(kāi)發(fā)細(xì)節(jié)
編程語(yǔ)言: Go 1.6+
SpokenAi使用依賴(lài)于portaudio,需要提前安裝好portaudio否則編譯無(wú)法通過(guò)
PortAudio
一.PortAudio下載地址:
Mac和Linux比較好安裝,Windows只能源碼編譯安裝,具體流程如下:
PortAudio Window 安裝流程
PortAudio Window DLLs 安裝流程
除此之外,可以直接選擇網(wǎng)上編譯好的庫(kù),可以從這里https://github.com/spatialaudio/portaudio-binaries下載。
在后續(xù)編譯鏈接過(guò)程中,還是需要安裝gcc, 推薦安裝MinGW-w64。
安裝完成MinGW后,將下載PortAudio庫(kù)文件libportaudio-x86_64-w64-mingw32.static.dll 更名成portaudio.dll,放到MinGW ld能搜索到的庫(kù)路徑。
將PortAudio庫(kù)文件libportaudio-x86_64-w64-mingw32.static.dll 放到Window System32目錄下,在運(yùn)行時(shí)程序需要找到該動(dòng)態(tài)庫(kù)
調(diào)用PortAudio的核心代碼
主要實(shí)現(xiàn)功能有:
- 支持開(kāi)始錄音和停止錄音
- 最長(zhǎng)錄制60s的音頻,到時(shí)取消
2.播放音頻
// PlayWavFile 播放指定的WAV文件 func PlayWavFile(filename string) error {// 打開(kāi)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()// 初始化揚(yáng)聲器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 }語(yǔ)音合成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
有簡(jiǎn)單調(diào)用云服務(wù)的,也有自己安裝環(huán)境的。調(diào)用云服務(wù)需要注冊(cè)賬號(hào),按量收費(fèi),比較費(fèi)錢(qián) 🙂。決定自己部署,采用TensorFlowTTS,通過(guò)構(gòu)建Docker容器運(yùn)行該服務(wù)。
Dockerfile如下,第一次構(gòu)建速度會(huì)比較慢。
FROM tensorflow/tensorflow:2.6.0# 安裝必要的依賴(lài) 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# 運(yùn)行REST API服務(wù)器 CMD python /app/tts-server-api.py --host 0.0.0.0 --port 5000如果不想自己自定義,可以直接下載我構(gòu)建好的服務(wù)
docker pull ptonlix/tensorflowtts:1.0.9 docker run -itd -p 5000:5000 --name spokenai-tts ptonlix/tensorflowtts:1.0.9tts-server-api.py 是啟動(dòng)Flask的API服務(wù)的腳本,對(duì)外提供/api/tts 文字轉(zhuǎn)語(yǔ)音接口
@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')解決完上述兩個(gè)關(guān)鍵問(wèn)題,剩下就是業(yè)務(wù)代碼的編寫(xiě)
配置文件
[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為聊天上下文存儲(chǔ)
- audio為音頻存儲(chǔ)
- record為錄音文件存儲(chǔ)目錄
- play為語(yǔ)言合成文件存儲(chǔ)目錄
- enable 可以選為是否開(kāi)啟語(yǔ)音合成,默認(rèn)不開(kāi)啟,開(kāi)啟需要運(yùn)行tensorflowtts。
- ttshost 為tts api服務(wù)地址
六.部署運(yùn)行
🚀項(xiàng)目地址:https://github.com/ptonlix/spokenai
🌟歡迎Star 、PR 、 Issue 、交流
編譯運(yùn)行
安裝portaudio, 參考上節(jié)PortAudio流程
# 下載源碼 git clone https://github.com/ptonlix/spokenai.git cd spokenai# 修改配置文件 edit fat_config.toml# 編譯 go build# 查看命令 ./spokenai -h# 運(yùn)行 ./spokenai運(yùn)行示例
windows啟動(dòng):
Mac啟動(dòng):
開(kāi)始對(duì)話(huà):
后續(xù)計(jì)劃
- 尋找志同道合的小伙伴,有意向一起制作一款A(yù)i應(yīng)用的請(qǐng)聯(lián)系我!!!
- 修復(fù)Bug,目前發(fā)現(xiàn)mac上語(yǔ)音播放一定概率播放失敗
- 編碼后端服務(wù)和客戶(hù)端程序
總結(jié)
以上是生活随笔為你收集整理的基于ChatGPT制作的一款英语口语练习应用SpokenAi的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【程序包uti1不存在怎么办?】求解答
- 下一篇: RN综合演练,仿美团电商(谢谢你的STA