AI虛擬點讀機(jī),手勢識別+OCR+語音TTS
哈嘍,大家好。
最近在研究AIGC方面的內(nèi)容,好久沒有更新公眾號內(nèi)容。
今天給大家分享的是用計算機(jī)視覺技術(shù)做一個虛擬點讀機(jī)。
圖片
技術(shù)上很簡單,只不過工程實現(xiàn)先有些細(xì)節(jié)需要注意。
1. 思路
- OpenCV讀取視頻流,識別食指坐標(biāo)
- 用兩個食指坐標(biāo)作為頂點,畫一個矩形框
- 截取矩形框,送入OCR模型識別文本
- 用語音合成引擎TTS將文本合成語音
- 調(diào)用音頻播放模塊,播放聲音
2. 細(xì)節(jié)處理
OpenCV讀取視頻流、mediapipe識別食指坐標(biāo),之前的分享的文章都有代碼,這里就不貼了,重點說下需要處理的細(xì)節(jié)。
細(xì)節(jié)1. 檢測到兩個食指時,需要設(shè)置一個時間間隔,這樣可以給你預(yù)留一些時間來調(diào)整矩形框
if self.point_start_time is None:
# 首次同時檢測到左右食指
self.point_start_time = time.time()
else:
time_del = time.time() - self.point_start_time
if time_del > 3:
圖片
細(xì)節(jié)2. 設(shè)置標(biāo)記,防止重復(fù)識別
矩形框一旦確定,如果沒有標(biāo)記,每一幀都會送入OCR模型識別、然后播放聲音,這樣程序就會卡死。
需要設(shè)置標(biāo)記,保證任何時刻只處理一個矩形框。
if not self.is_processing:
# 開始識別
self.is_processing = True
# ocr識別選定的圖片
t, b = min(p0_y, p1_y), max(p0_y, p1_y)
l, r = min(p0_x, p1_x), max(p0_x, p1_x)
selected_frame = frame[t:b, l:r]
# ocr識別文字
text = self.ocr_rec(selected_frame)
# 文本轉(zhuǎn)語音
voice = self.tts.get_speech(text)
# 播放語音
self.player.play(voice, False, notallow=lambda: self.stop_play())
self.pc_time = time.time()
細(xì)節(jié)3. 多線程處理
播放音頻的時候需要用多線程播放,不然主程序會卡死,知道音頻播放完成才能繼續(xù)運行。
如果識別的內(nèi)容很多,播放時間長,程序就會一直卡著很長時間沒有反應(yīng)。
3. 其他技術(shù)
關(guān)于OCR和TTS技術(shù)之前的文章都有介紹過。
OCR直接用Paddle框架和預(yù)訓(xùn)練好的模型就行。
TTS如果是Mac可以使用系統(tǒng)自帶的,不需要安裝其他程序。如果是Windows可以使用微軟的edge-tts。edge-tts效果比大部分tts強(qiáng)太多。
也可以用d-id、wav2lip或者sadtalker實現(xiàn)唇形合成,讓靜態(tài)圖片朗讀文本內(nèi)容。