AI虛擬點讀機,手勢識別+OCR+語音TTS
哈嘍,大家好。
最近在研究AIGC方面的內容,好久沒有更新公眾號內容。
今天給大家分享的是用計算機視覺技術做一個虛擬點讀機。
圖片
技術上很簡單,只不過工程實現先有些細節需要注意。
1. 思路
- OpenCV讀取視頻流,識別食指坐標
- 用兩個食指坐標作為頂點,畫一個矩形框
- 截取矩形框,送入OCR模型識別文本
- 用語音合成引擎TTS將文本合成語音
- 調用音頻播放模塊,播放聲音
2. 細節處理
OpenCV讀取視頻流、mediapipe識別食指坐標,之前的分享的文章都有代碼,這里就不貼了,重點說下需要處理的細節。
細節1. 檢測到兩個食指時,需要設置一個時間間隔,這樣可以給你預留一些時間來調整矩形框
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:
圖片
細節2. 設置標記,防止重復識別
矩形框一旦確定,如果沒有標記,每一幀都會送入OCR模型識別、然后播放聲音,這樣程序就會卡死。
需要設置標記,保證任何時刻只處理一個矩形框。
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)
# 文本轉語音
voice = self.tts.get_speech(text)
# 播放語音
self.player.play(voice, False, notallow=lambda: self.stop_play())
self.pc_time = time.time()
細節3. 多線程處理
播放音頻的時候需要用多線程播放,不然主程序會卡死,知道音頻播放完成才能繼續運行。
如果識別的內容很多,播放時間長,程序就會一直卡著很長時間沒有反應。
3. 其他技術
關于OCR和TTS技術之前的文章都有介紹過。
OCR直接用Paddle框架和預訓練好的模型就行。
TTS如果是Mac可以使用系統自帶的,不需要安裝其他程序。如果是Windows可以使用微軟的edge-tts。edge-tts效果比大部分tts強太多。
也可以用d-id、wav2lip或者sadtalker實現唇形合成,讓靜態圖片朗讀文本內容。