import face_recognition
import cv2
from google.cloud import texttospeech
import vlc
import time
import os
#from google.cloud.bigquery.client import Client
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'E:\\Sem5\\Hackathon\\codeoverflow-08-10e832d41721.json'

# Instantiates a client
client = texttospeech.TextToSpeechClient()
voice = texttospeech.types.VoiceSelectionParams(
        language_code='en-US',
        ssml_gender=texttospeech.enums.SsmlVoiceGender.NEUTRAL)

audio_config = texttospeech.types.AudioConfig(
        audio_encoding=texttospeech.enums.AudioEncoding.MP3)

def texttospeech1(string, voice, audio_config, hello=None):
    # Set the text input to be synthesized
    sample=hello+string

    synthesis_input = texttospeech.types.SynthesisInput(text=sample)

    # Build the voice request, select the language code ("en-US") and the ssml
    # voice gender ("neutral")

    # Select the type of audio file you want returned
    

    # Perform the text-to-speech request on the text input with the selected
    # voice parameters and audio file type
    response = client.synthesize_speech(synthesis_input, voice, audio_config)

    # The response's audio_content is binary.
    with open('output.mp3', 'wb') as out:
        # Write the response to the output file.
        out.write(response.audio_content)
        print('Audio content written to file "output.mp3"')
    player = vlc.MediaPlayer("output.mp3")
    player.play()
    

#name=""

# This is a super simple (but slow) example of running face recognition on live video from your webcam.
# There's a second example that's a little more complicated but runs faster.

# PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam.
# OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this
# specific demo. If you have trouble installing it, try any of the other demos that don't require it instead.

# Get a reference to webcam #0 (the default one)
video_capture = cv2.VideoCapture(0)

dhruv_image = face_recognition.load_image_file("dhruv.jpg")
dhruv_face_encoding = face_recognition.face_encodings(dhruv_image)[0]

# Load a second sample picture and learn how to recognize it.
kunal_image = face_recognition.load_image_file("kunal.jpg")
kunal_face_encoding = face_recognition.face_encodings(kunal_image)[0]

arush_image= face_recognition.load_image_file("arush3.jpg")
arush_face_encoding = face_recognition.face_encodings(arush_image)[0]

pruthviraj_image = face_recognition.load_image_file("pruthviraj.jpg")
pruthviraj_face_encoding = face_recognition.face_encodings(pruthviraj_image)[0]

# Create arrays of known face encodings and their names
known_face_encodings = [dhruv_face_encoding, kunal_face_encoding, arush_face_encoding, pruthviraj_face_encoding]


known_face_names = [
    "Dhruv",
    "Kunal",
    "Arush",
    "Pruthviraj"
]

flag=0
name1=""
j=0

while True:
    global name
    # Grab a single frame of video
    ret, frame = video_capture.read()

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_frame = frame[:, :, ::-1]

    # Find all the faces and face enqcodings in the frame of video
    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    # Loop through each face in this frame of video
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # See if the face is a match for the known face(s)
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.4)

        name = "Unknown"

        # If a match was found in known_face_encodings, just use the first one.
        if True in matches:
            first_match_index = matches.index(True)
            name = known_face_names[first_match_index]
            name1=name
            j=j+1

        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # Draw a label with a name below the face
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
        #if(name=="Arush" or name=="Dhruv" or name=="Pruthviraj" or name=="Kunal"):
            #break

    # Display the resulting image
    cv2.imshow('Video', frame)
    #time.sleep(2)
    #if(name1=="Arush" or name1=="Dhruv" or name1=="Pruthviraj" or name1=="Kunal"):
            #break
    if(j>3):
        break
    
    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'):
        flag=1
        break

# Release handle to the webcam
video_capture.release()
cv2.destroyAllWindows()






if(flag!=1):
    texttospeech1(name1, voice, audio_config, hello="Hello")




