序文 最近、突然素晴らしいアイデアが浮かびました。コンピューターの画面に顔を向けると、コンピューターはまず画面上の顔が自分の顔かどうかを識別します。自分の顔だと認識された場合、コンピューターが言ったコードワードに答える必要があります。答えが正しければロックが解除され、チャンスは3回あります。正しく回答しないと、誰かが私のコンピューターを操作していることを知らせるメールが送信され、その人のプロフィール写真がアップロードされます。 プロセス 環境はwin10コードです。python3を使用しているため、開始する前にいくつかの依存パッケージをインストールする必要があります。順番にインストールしてください。そうしないとエラーが発生します。 - pip インストール cmake -i https://pypi.tuna.tsinghua.edu.cn/simple
- pip で dlib をインストール -i https://pypi.tuna.tsinghua.edu.cn/simple
- フェイス認識をpipでインストール -i https://pypi.tuna.tsinghua.edu.cn/simple
- pip で opencv-python をインストール -i https://pypi.tuna.tsinghua.edu.cn/simple
次は、顔を認識して比較するためのコードを構築する。 - 顔認識をインポートする
- cv2をインポート
- numpyをnpとしてインポートする
- ビデオキャプチャ= cv2.VideoCapture (0)
- my_image =顔認識.load_image_file("my.jpg")
- my_face_encoding = face_recognition.face_encodings (私の画像)[0]
- 既知の顔エンコーディング= [
- 私の顔のエンコーディング
- ]
- 知られている顔の名前= [
- 「管理者」
- ]
- 顔の名前= []
- 顔の位置= []
- フェイスエンコーディング= []
- process_this_frame = True
- 真の場合:
- ret、フレーム= video_capture .read()
- 小さいフレーム= cv2.resize (フレーム、(0, 0)、 fx = 0.25 、 fy = 0.25 )
- rgb_small_frame = 小さいフレーム[:, :, ::-1]
- process_this_frameの場合:
- 顔の位置=顔認識.顔の位置(rgb_small_frame)
- face_encodings = face_recognition.face_encodings (rgb_small_frame、face_locations) です。
- 顔の名前= []
- face_encodings の face_encoding の場合:
- 一致= face_recognition.compare_faces (known_face_encodings、face_encoding)
- 名前= "不明"
- 顔距離=顔認識.顔距離(既知の顔エンコーディング、顔エンコーディング)
- best_match_index = np.argmin (面の距離)
- [best_match_index]と一致する場合:
- name =既知の顔の名前[ベストマッチインデックス]
- face_names.append(名前)
- process_this_frame =ではないprocess_this_frame
- (上、右、下、左)、zip 内の名前(face_locations、face_names):
- トップ *= 4
- 左 *= 4
- 右 *= 4
- 下 *= 4
- フォント= cv2.FONT_HERSHEY_DUPLEX
- cv2.rectangle(フレーム、(左、上)、(右、下)、(0、0、255)、2)
- cv2.rectangle(フレーム、(左、下 - 35)、(右、下)、(0、0、255)、cv2.FILLED)
- cv2.putText(フレーム、名前、(左 + 6、下 - 6)、フォント、1.0、(255、255、255)、1)
- cv2.imshow('ビデオ', フレーム)
- cv2.waitKey(1) & 0xFF == ord('q')の場合:
- 壊す
- ビデオキャプチャーのリリース()
- cv2.すべてのウィンドウを破棄する()
写真を撮って、my.jpg をアップロードする必要があります。実行すると、顔に管理者フレームが表示されます。インターネットで次のような写真を見つけました。 認識機能が完成しました。次のステップは音声認識と音声合成です。これにはBaidu AIを使用する必要があります。Baidu AIの公式サイトにログインし、コンソールの左側にある音声テクノロジーを選択します。次に、パネルの[アプリケーションの作成]ボタンをクリックして、[アプリケーションの作成]インターフェイスに入ります。 顔認証ロック解除ツールのコンピューター版を作成する 作成後、AppID、API キー、シークレット キーが取得されます。これらを書き留めてから、音声合成コードの作成を開始します。 Baidu AIが提供する依存パッケージをインストールする - baidu-aip を pip でインストール -i https://pypi.tuna.tsinghua.edu.cn/simple
- プレイサウンドをpipでインストール -i https://pypi.tuna.tsinghua.edu.cn/simple
次に簡単な音声再生コードがあります。以下のコードを実行すると可愛い女の子の声が聞こえます。 - インポートシステム
- aipからAipSpeechをインポート
- playsoundからplaysoundをインポート
- アプリケーションID = ''
- API_KEY = ''
- シークレットキー= ''
- クライアント= AipSpeech (APP_ID、API_KEY、SECRET_KEY)
- 結果=クライアント.synthesis('Hello', 'zh', 1, {'vol': 5, 'per': 4, 'spd': 5, })
- isinstance(result, dict)でない場合:
- ファイルとして open('auido.mp3', 'wb') を実行:
- file.write(結果)
- ファイルパス= eval (repr(sys.path[0]).replace('\\', '/')) + '//auido.mp3'
- playsound(ファイルパス)
上記のコードでは、コンピューターの前にいるかどうかの検出(顔認識)と、コンピューターによる秘密コードの読み取り(音声合成)が完了しました。次に、コンピューターに秘密コードを答える必要があるため、音声認識も完了する必要があります。 - 輸入波
- pyaudioをインポートする
- aipからAipSpeechをインポート
- アプリケーションID = ''
- API_KEY = ''
- シークレットキー= ''
- クライアント= AipSpeech (APP_ID、API_KEY、SECRET_KEY)
- チャンク= 1024
- フォーマット= pyaudio.paInt16
- チャンネル= 1
- レート= 8000
- 記録秒数= 3
- WAVE_OUTPUT_FILENAME = "output.wav"
- p = pyaudio.PyAudio ()関数
- ストリーム= p .open(フォーマット= FORMAT 、チャンネル= CHANNELS 、レート= RATE 、入力= True 、 frames_per_buffer = CHUNK )
- print("* 記録")
- フレーム= []
- i が範囲(0, int(RATE / CHUNK * RECORD_SECONDS))内である場合:
- データ=ストリーム.read(CHUNK)
- フレーム.append(データ)
- print("* 記録完了")
- ストリームを停止します。
- ストリームを閉じる()
- p.終了()
- wf = wave .open(WAVE_OUTPUT_FILENAME, 'wb')
- wf.setnchannels(チャンネル)
- wf.setsampwidth(p.get_sample_size(FORMAT))
- wf.setframerate(レート)
- wf.writeframes(b''.join(フレーム))
- get_file_content() を定義します:
- open(WAVE_OUTPUT_FILENAME, 'rb') を fp として実行します:
- fp.read() を返す
- 結果=クライアント.asr(get_file_content(), 'wav', 8000, {'dev_pid': 1537, })
- 印刷(結果)
このコードを実行する前に、pyaudio 依存パッケージをインストールする必要があります。Windows 10 システムではインストール中にエラーが発生するため、次のようにインストールできます。このリンク https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio にアクセスして、対応するインストール パッケージをダウンロードし、インストールします。 顔認証ロック解除ツールのコンピューター版を作成する 走った後、挨拶をすると認識されたのが分かりました。これで小さなモジュール機能はすべて準備が整いました。次のステップは、それらをどのように統合するかです。顔認識コードでは、matches[best_match_index]を使用して、その人がコンピューターの所有者であるかどうかを判断していることがわかります。そのため、この判断ステートメントをメイン関数のエントリと見なします。 - [best_match_index]と一致する場合:
- # 認識後の関数をここに記述します
- name =既知の顔の名前[ベストマッチインデックス]
認識後、コンピューターにクエリ コード (音声合成コード) を送信させます。次に、それを関数にカプセル化し、顔認識コードを再構築します。 - cv2をインポート
- インポート時間
- numpyをnpとしてインポートする
- 顔認識をインポートする
- ビデオキャプチャ= cv2.VideoCapture (0)
- my_image =顔認識.load_image_file("my.jpg")
- my_face_encoding = face_recognition.face_encodings (私の画像)[0]
- 既知の顔エンコーディング= [
- 私の顔のエンコーディング
- ]
- 知られている顔の名前= [
- 「管理者」
- ]
- 顔の名前= []
- 顔の位置= []
- フェイスエンコーディング= []
- process_this_frame = True
- def 話す(コンテンツ):
- インポートシステム
- aipからAipSpeechをインポート
- playsoundからplaysoundをインポート
- アプリケーションID = ''
- API_KEY = ''
- シークレットキー= ''
- クライアント= AipSpeech (APP_ID、API_KEY、SECRET_KEY)
- 結果=クライアント.synthesis(content, 'zh', 1, {'vol': 5, 'per': 0, 'spd': 5, })
- isinstance(result, dict)でない場合:
- ファイルとして open('auido.mp3', 'wb') を実行:
- file.write(結果)
- ファイルパス= eval (repr(sys.path[0]).replace('\\', '/')) + '//auido.mp3'
- playsound(ファイルパス)
- 試す:
- 真の場合:
- ret、フレーム= video_capture .read()
- 小さいフレーム= cv2.resize (フレーム、(0, 0)、 fx = 0.25 、 fy = 0.25 )
- rgb_small_frame = 小さいフレーム[:, :, ::-1]
- process_this_frameの場合:
- 顔の位置=顔認識.顔の位置(rgb_small_frame)
- face_encodings = face_recognition.face_encodings (rgb_small_frame、face_locations) です。
- 顔の名前= []
- face_encodings の face_encoding の場合:
- 一致= face_recognition.compare_faces (known_face_encodings、face_encoding)
- 名前= "不明"
- 顔距離=顔認識.顔距離(既知の顔エンコーディング、顔エンコーディング)
- best_match_index = np.argmin (面の距離)
- [best_match_index]と一致する場合:
- 話す("あなたの顔を認識したので、コードを尋ね始めました。次に尋ねる質問に答えてください")
- 時間.睡眠(1)
- 話す("天王盖地虎")
- エラー= 1 / 0
- name =既知の顔の名前[ベストマッチインデックス]
- face_names.append(名前)
- process_this_frame =ではないprocess_this_frame
- (上、右、下、左)、zip 内の名前(face_locations、face_names):
- トップ *= 4
- 左 *= 4
- 右 *= 4
- 下 *= 4
- フォント= cv2.FONT_HERSHEY_DUPLEX
- cv2.rectangle(フレーム、(左、上)、(右、下)、(0、0、255)、2)
- cv2.rectangle(フレーム、(左、下 - 35)、(右、下)、(0、0、255)、cv2.FILLED)
- cv2.putText(フレーム、名前、(左 + 6、下 - 6)、フォント、1.0、(255、255、255)、1)
- cv2.imshow('ビデオ', フレーム)
- cv2.waitKey(1) & 0xFF == ord('q')の場合:
- 壊す
- except 例外を e として:
- 印刷する
- ついに:
- ビデオキャプチャーのリリース()
- cv2.すべてのウィンドウを破棄する()
ここで注意すべきことが1つあります。playsoundは音楽を再生するときに常にこのリソースを占有するため、次の音楽を再生するときにエラーが報告されます。解決策は、~\Python37\Lib\site-packagesのplaysound.pyファイルを変更し、次のコードを見つけることです。 顔認証ロック解除ツールのコンピューター版を作成する sleep 関数の下にコード winCommand('close', alias) を追加して保存します。走った後、両方の文章を普通に話せることが分かりました。したがって、それを言った後は、それを監視する必要があり、関数をパッケージ化する必要もあります。 - レコード()を定義します:
- 輸入波
- jsonをインポート
- pyaudio をインポートする
- aipからAipSpeechをインポート
- アプリケーションID = ''
- API_KEY = ''
- シークレットキー= ''
- クライアント= AipSpeech (APP_ID、API_KEY、SECRET_KEY)
- チャンク= 1024
- フォーマット= pyaudio.paInt16
- チャンネル= 1
- レート= 8000
- 記録秒数= 3
- WAVE_OUTPUT_FILENAME = "output.wav"
- p = pyaudio.PyAudio ()関数
- ストリーム= p .open(フォーマット= FORMAT 、チャンネル= CHANNELS 、レート= RATE 、入力= True 、 frames_per_buffer = CHUNK )
- print("* 記録")
- フレーム= []
- i が範囲(0, int(RATE / CHUNK * RECORD_SECONDS))内である場合:
- データ=ストリーム.read(CHUNK)
- フレーム.append(データ)
- print("* 記録完了")
- ストリーム.stop_stream()
- ストリームを閉じる()
- p.終了()
- wf = wave .open(WAVE_OUTPUT_FILENAME, 'wb')
- wf.setnchannels(チャンネル)
- wf.setsampwidth(p.get_sample_size(FORMAT))
- wf.setframerate(レート)
- wf.writeframes(b''.join(フレーム))
- get_file_content() を定義します:
- open(WAVE_OUTPUT_FILENAME, 'rb') を fp として実行します:
- fp.read() を返す
- 結果=クライアント.asr(get_file_content(), 'wav', 8000, {'dev_pid': 1537, })
- 結果= json .loads(str(result).replace("'", '"'))
- 結果を返す["結果"][0]
顔認識後のコードを次のように変更します - [best_match_index]と一致する場合:
- 話す("あなたの顔を認識したので、コードを尋ね始めました。次に尋ねる質問に答えてください")
- 時間.睡眠(1)
- 話す("天王盖地虎")
- フラグ= False
- 範囲(0, 3)内の時間の場合:
- コンテンツ=レコード()
- コンテンツに「キノコ入りチキンシチュー」が含まれている場合:
- 話す("コードが通過しました")
- フラグ= True
- 壊す
- それ以外:
- 話す("コードが失敗しました。もう一度お試しください")
- フラグの場合:
- print("ロック解除")
- それ以外:
- print("メールを送信し、悪者の顔写真をアップロードしてください!")
- エラー= 1 / 0
- name =既知の顔の名前[ベストマッチインデックス]
プログラムを実行して結果を確認します。コンピューターに「キノコ入りチキンシチュー」と答えると、コンピューターは「合格」というコードを返します。この機能は基本的に完成しています。 顔認証ロック解除ツールのコンピューター版を作成する 結論 メールの送信やロック画面の解除などの機能については、一つ一つ実装するつもりはありません。皆さんにとって難しいことではないと思います。ロック画面機能は、キーボードの時間をフックして無効にし、ウィンドウを使用してデスクトップ全体を覆うことができます。オンライン記事をメールボックスに送信する機能はたくさんあります。 |