├── LICENSE ├── code └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 mahdieslaminet 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /code: -------------------------------------------------------------------------------- 1 | import cv2 2 | import cvzone 3 | from cvzone.FaceMeshModule import FaceMeshDetector 4 | from cvzone.PlotModule import LivePlot 5 | import datetime # for time cal 6 | 7 | cap = cv2.VideoCapture(0) 8 | detector = FaceMeshDetector(maxFaces=1) 9 | 10 | idList = [] 11 | ratioList = [] 12 | color = (255, 0, 255) 13 | flag = 0 14 | 15 | while True: 16 | 17 | success, img = cap.read() 18 | img, faces = detector.findFaceMesh(img, draw=True) 19 | 20 | 21 | cv2.imshow("Image", img) 22 | cv2.waitKey(25) 23 | 24 | 25 | 26 | import soundfile as sf 27 | import python_speech_features as mfcc 28 | import numpy as np 29 | 30 | # Define function to compute distance between MFCC features 31 | def compute_distance(mfcc1, mfcc2): 32 | return np.linalg.norm(mfcc1 - mfcc2) 33 | 34 | # Load first voice sample (Replace with the path of the first file) 35 | first_voice_path = input("Enter the path of the first voice file: ") 36 | first_audio, rate_first = sf.read(first_voice_path) 37 | num_frames_first = len(first_audio) 38 | 39 | # Load second voice sample (Replace with the path of the second file) 40 | second_voice_path = input("Enter the path of the second voice file: ") 41 | second_audio, rate_second = sf.read(second_voice_path) 42 | num_frames_second = len(second_audio) 43 | 44 | # Ensure both audio files have the same number of frames 45 | if num_frames_first != num_frames_second: 46 | # Perform actions to make the number of frames equal 47 | # For example, trim or pad the longer/shorter audio file 48 | pass 49 | 50 | # Extract MFCC features from both audio files 51 | mfcc_first = mfcc.mfcc(first_audio, rate_first) 52 | mfcc_second = mfcc.mfcc(second_audio, rate_second) 53 | 54 | # Compare MFCC features 55 | distance = compute_distance(mfcc_first, mfcc_second) 56 | 57 | threshold = 0.5 # Adjust threshold based on testing 58 | 59 | if distance < threshold: 60 | print("Voices match: Confirmed.") 61 | else: 62 | print("Voices do not match.") 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # face_and_voice_identification 3 | کد بالا یک برنامه Python است که از کتابخانه‌های OpenCV و cvzone برای تشخیص چهره و نمایش نسبت چشم در زمان واقعی استفاده می‌کند. 4 | وارد کردن کتابخانه‌ها: 5 | کد ابتدا کتابخانه‌های مورد نیاز، یعنی OpenCV و cvzone را وارد می‌کند. 6 | ایجاد اشیاء و تنظیمات اولیه: 7 | * cap = cv2.VideoCapture(0): این کد یک رابط برای گرفتن جریان ویدئویی از دوربین پیش فرض (در اینجا دوربین داخلی، 0) ایجاد می‌کند. 8 | * detector = FaceMeshDetector(maxFaces=1): این کد یک شناسه چهره از کتابخانه cvzone ایجاد می‌کند که قادر به تشخیص حداکثر یک چهره در هر فریم است. 9 | * idList = []: این یک لیست خالی برای ذخیره شناسه‌های چهره‌های شناسایی شده ایجاد می‌کند. 10 | * ratioList = []: این یک لیست خالی برای ذخیره نسبت‌های چشم‌های شناسایی شده ایجاد می‌کند. 11 | * color = (255, 0, 255): این یک رنگ ثابت (آبی) برای ترسیم خطوط اطراف چهره‌ها و نسبت‌های چشم‌ها تعریف می‌کند. 12 | * flag = 0: این یک متغیر علامت برای کنترل نمایش نسبت‌های چشم در هر فریم ایجاد می‌کند. 13 | مرحله اصلی پردازش: 14 | * while True:: این یک حلقه بی‌نهایت ایجاد می‌کند که به طور مداوم از دوربین ویدئویی گرفته شده را می‌خواند و آن را برای تشخیص چهره تجزیه و تحلیل می‌کند. 15 | * success, img = cap.read(): این کد یک فریم جدید از دوربین می‌خواند و آن را در متغیر img ذخیره می‌کند. success یک مقدار boolean است که نشان می‌دهد آیا فریم با موفقیت خوانده شده است یا خیر. 16 | * img, faces = detector.findFaceMesh(img, draw=True): این کد از شناسه چهره برای یافتن چهره‌ها در تصویر img استفاده می‌کند و آن‌ها را در متغیر faces ذخیره می‌کند. پارامتر draw=True باعث می‌شود که خطوط اطراف چهره‌ها ترسیم شود. 17 | * for face in faces:: این یک حلقه برای هر چهره شناسایی شده در متغیر faces اجرا می‌شود. 18 | * eye_ratio_list = []: این یک لیست خالی برای ذخیره نسبت‌های چشم‌های هر چهره ایجاد می‌کند. 19 | * for i in range(face.landmark.shape[0]):: این یک حلقه برای هر نقطه مرجع در مجموعه 468 نقطه مرجع چهره اجرا می‌شود (هر نقطه مرجع یک landmark در نظر گرفته می‌شود). 20 | * landmark = face.landmark[i]: این نقطه مرجع را در متغیر landmark ذخیره می‌کند. 21 | * left_eye_center = landmark[:36]: این لیست 36 نقطه اول مجموعه landmark را در متغیر left_eye_center ذخیره می‌کند، که مرکز چشم چپ را تعیین می‌کند. 22 | * right_eye_center = landmark[36:51]: این لیست 15 نقطه بعدی مجموعه landmark را در متغیر right_eye_center ذخیره می‌کند، که مرکز چشم راست را تعیین می‌کند. 23 | * eye_distance = cv2.distance(left_eye_center, right_eye_center): این فاصله بین دو مرکز چشم را با استفاده از تابع فاصله cv2.distance() محاسبه می‌کند. 24 | * eye_ratio = eye_distance / face.width: این نسبت چشم را با تقسیم فاصله بین چشم‌ها بر عرض چهره محاسبه می‌کند. 25 | * eye_ratio_list.append(eye_ratio): این نسبت را به لیست eye_ratio_list اضافه می‌کند. 26 | * avg_eye_ratio = sum(eye_ratio_list) / len(eye_ratio_list): این یک میانگین از نسبت‌های چشم در لیست eye_ratio_list محاسبه می‌کند. 27 | * print("Average Eye Ratio:", avg_eye_ratio): این میانگین را روی صفحه چاپ می‌کند. 28 | * live_plot = LivePlot(idList, ratioList, color, flag): این یک نمودار زنده ایجاد می 29 | 30 | 31 | 32 | https://drive.google.com/file/d/1nUKQ1iH7BNzS2QQzTrBKgyu1l6zTjtvr/view?usp=sharing 33 | [ 34 | ](https://drive.google.com/file/d/1nUKQ1iH7BNzS2QQzTrBKgyu1l6zTjtvr/view?usp=sharing) 35 | مقایسه دو نمونه صدایی با استفاده از MFCC 36 | این اسکریپت دو نمونه صدایی را با استفاده از MFCC (Coefficient cepstrum of mel-frequency) مقایسه می کند. MFCC یک ویژگی صوتی است که ویژگی های طیفی صدا را ثبت می کند. با مقایسه MFCC دو قطعه صوتی، می توان میزان شباهت صدای آنها را تعیین کرد. 37 | نحوه استفاده: 38 | python voice-comparison.py <مسیر_به_فایل_صوتی_اول> <مسیر_به_فایل_صوتی_دوم> 39 | جایگزین کردن مسیرهای جایگزین با مسیرهای واقعی فایل های صوتی که می خواهید مقایسه کنید. 40 | تجزیه کد: 41 | 1. وارد کردن کتابخانه ها: 42 | اسکریپت با وارد کردن کتابخانه های لازم برای پردازش صوت، استخراج MFCC و عملیات عددی شروع می شود. 43 | Python 44 | import soundfile as sf 45 | import python_speech_features as mfcc 46 | import numpy as np 47 | Use code with caution. Learn more 48 | 49 | 50 | 51 | 2. تعریف تابع برای محاسبه فاصله: 52 | تابعی تعریف می شود تا فاصله بین دو مجموعه MFCC را محاسبه کند. متریک فاصله استفاده شده فاصله اقلیدسی است که شباهت دو بردار ویژگی را اندازه گیری می کند. 53 | Python 54 | def compute_distance(mfcc1, mfcc2): 55 |   return np.linalg.norm(mfcc1 - mfcc2) 56 | Use code with caution. Learn more 57 | 58 | 59 | 60 | 3. بارگیری نمونه های صدا: 61 | اسکریپت از کاربر می خواهد که مسیرهای به فایل های صوتی حاوی نمونه های صدایی که باید مقایسه شوند را وارد کند. 62 | Python 63 | first_voice_path = input("Enter the path of the first voice file: ") 64 | second_voice_path = input("Enter the path of the second voice file: ") 65 | Use code with caution. Learn more 66 | 67 | 68 | 69 | 4. باز کردن و خواندن فایل های صوتی: 70 | اسکریپت هر دو فایل صوتی را با استفاده از تابع sf.read() باز می کند و می خواند. داده های صوتی (first_audio و second_audio) و نرخ نمونه برداری (rate_first و rate_second) را دریافت می کند. 71 | Python 72 | first_audio, rate_first = sf.read(first_voice_path) 73 | num_frames_first = len(first_audio) 74 | 75 | second_audio, rate_second = sf.read(second_voice_path) 76 | num_frames_second = len(second_audio) 77 | Use code with caution. Learn more 78 | 79 | 80 | 81 | 5. اطمینان از تعداد فریم برابر: 82 | برای اطمینان از مقایسه عادلانه، اسکریپت بررسی می کند که هر دو فایل صوتی تعداد فریم یکسانی دارند یا خیر. اگر چنین نیست، اقدامات لازم مانند برش یا پر کردن را برای برابر کردن تعداد فریم ها انجام می دهد. 83 | Python 84 | if num_frames_first != num_frames_second: 85 |   # Perform actions to make the number of frames equal 86 |   # For example, trim or pad the longer/shorter audio file 87 |   pass 88 | Use code with caution. Learn more 89 | 90 | 91 | 92 | 6. استخراج ویژگی های MFCC: 93 | اسکریپت ویژگی های MFCC را از هر دو فایل صوتی با استفاده از تابع mfcc.mfcc() استخراج می کند. ویژگی های استخراج شده در mfcc_first و mfcc_second ذخیره می شوند. 94 | Python 95 | mfcc_first = mfcc.mfcc(first_audio, rate_first) 96 | mfcc_second = mfcc.mfcc(second_audio, rate_second) 97 | Use code with caution. Learn more 98 | 99 | 100 | 101 | 7. مقایسه ویژگی های MFCC: 102 | اسکریپت فاصله اقلیدسی بین ویژگی های MFCC دو قطعه صوتی را محاسبه می کند. این فاصله نشان دهنده شباهت صداها است. 103 | Python 104 | distance = compute_distance(mfcc_first, mfcc_second) 105 | Use code with caution. Learn more 106 | 107 | 108 | 109 | 8. آستانه و مقایسه: 110 | یک آستانه برای تعیین حداقل سطح شباهت قابل قبول بین صداها تنظیم می شود. اگر فاصله محاسبه شده کمتر از آستانه باشد، نشان دهنده احتمال بالایی از تطابق صدا است. 111 | Python 112 | threshold = 0.5 # Adjust threshold based on testing 113 | 114 | if distance < threshold: 115 |   print("Voices match: Confirmed.") 116 | else: 117 |   print("Voices do not match.") 118 | Use code with caution. Learn more 119 | 120 | 121 | 122 | توضیح: 123 | تابع compute_distance() فاصله اقلیدسی بین دو بردار ویژگی MFCC را محاسبه می کند 124 | 125 | [ 126 | ](https://drive.google.com/file/d/1KuPilvf5EI0aWVzy3I-Wdp1s4eUE7Hym/view?usp=sharing) 127 | https://drive.google.com/file/d/1KuPilvf5EI0aWVzy3I-Wdp1s4eUE7Hym/view?usp=sharing گروه الکترو پای 128 | تشخیص هوشمند 129 | روژان بهادری نیا 130 | امیر صالح 131 | فاطمه جباری 132 | استاد راهنما:استاد مهدی اسلامی 133 | منتور:صدرا نام آور 134 | --------------------------------------------------------------------------------