顔を認識したらメールを読み上げる
import fitz
from playsound import playsound
import subprocess
import pygame
import time
# テキストから音声を生成して再生する関数
def generate_and_play_audio_from_text(text):
command_json = [
"curl", "-s", "-X", "POST",
"192.168.1.69:50021/audio_query?speaker=1",
"--get", "--data-urlencode", f"text={text}"
]
command_audio = [
"curl", "-s", "-H", "Content-Type: application/json", "-X", "POST",
"-d", "@query.json", "192.168.1.69:50021/synthesis?speaker=1"
]
with open('query.json', 'w') as file:
subprocess.run(command_json, stdout=file)
with open('audio_output.wav', 'wb') as file:
subprocess.run(command_audio, stdout=file)
pygame.init()
pygame.mixer.init()
sound = pygame.mixer.Sound("audio_output.wav")
sound.play()
while pygame.mixer.get_busy():
time.sleep(0.1)
# PDFファイルから文字数をカウントする関数
def count_pdf_characters(file_path):
doc = fitz.open(file_path)
text = ""
for page in doc:
text += page.get_text()
return len(text)
# メールの処理を行う関数
def process_email(service, label_id):
from gmail_utils import gmail_get_latest_unread_message_body
from pdf_downloader import find_preview_link, download_pdf
body, urls = gmail_get_latest_unread_message_body(service, label_id)
if body:
playsound('notice.wav')
generate_and_play_audio_from_text(body)
if urls:
for url in urls:
preview_url = find_preview_link(url)
if preview_url:
download_pdf(preview_url, "downloaded_file.pdf")
char_count = count_pdf_characters("downloaded_file.pdf")
if char_count >= 100:
playsound('notice_pdf.wav')
else:
print("プレビューリンクが見つかりませんでした。")
else:
print("メールにURLが見つかりませんでした。")
else:
print("未読メールはありません。")
というようにモジュールにして保存
ファイル名は
email_processor.py
とした
次に
Kao,pyで顔認識したらメールを読み上げるようにする
git clone https://github.com/Snowpooll/face_weather.git
で以前作成した顔認識したら天気を知らせるの中にあるものを
cp ../../face_weather/haarcascade_* .
でコピーして使う
import cv2
import time
from email_processor import process_email
from gmail_utils import gmail_init
# Haar Cascade分類器の読み込み
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Webカメラの設定
cap = cv2.VideoCapture(0) # 0番目のカメラを使用する場合
# Gmailサービスの初期化
service = gmail_init()
label_id = "ラベルID" # 例として特定のラベルIDを設定
# 最後の顔検出時刻
lastTime = None
# メインループ
while True:
# カメラからのフレームの取得
ret, frame = cap.read()
# フレームのグレースケール化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 顔の検出
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 検出された顔に対する処理
for (x, y, w, h) in faces:
# 検出自の処理(検出から1分たったら再度イベント動かす)
if lastTime is None or time.perf_counter() - lastTime > 60:
# 検出時刻更新
lastTime = time.perf_counter()
# メール処理関数を呼び出し
process_email(service, label_id)
# 後処理
cap.release()
cv2.destroyAllWindows()
で実行したら成功したが
間隔を一分にしたため
メールばかり読み上げになる
なので感覚を20分ぐらいに変更する
# 検出自の処理(検出から20分たったら再度イベント動かす)
if lastTime is None or time.perf_counter() - lastTime > 1200:
へ変更した
とりあえず動作確認は取れたので
次に設定ファイルを作成し
コードのメンテをしやすくする
とりあえず
docker サーバーIP
gmailのラベル
次の検出までの待ち時間
は設定ファイルにまとめておき
これを編集するだけでできるようにする