Spaces:
Sleeping
Sleeping
File size: 4,997 Bytes
5a813b2 b8750fa 5a813b2 b8750fa 5a813b2 b8750fa 5a813b2 b8750fa 5a813b2 b8750fa 5a813b2 8c6351b 5a813b2 b8750fa 5a813b2 b8750fa 8c6351b b8750fa 8c6351b b8750fa 1cc6fa9 8c6351b b8750fa 8c6351b b8750fa 8c6351b 5a813b2 8c6351b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
import base64
from threading import Lock, Thread
import cv2
import openai
import sounddevice as sd
import streamlit as st
from cv2 import VideoCapture, imencode
from dotenv import load_dotenv
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema.messages import SystemMessage
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from scipy.io.wavfile import write
from speech_recognition import Recognizer, UnknownValueError, AudioData
load_dotenv()
class WebcamStream:
def __init__(self):
self.stream = VideoCapture(index=0)
_, self.frame = self.stream.read()
self.running = False
self.lock = Lock()
def start(self):
if self.running:
return self
self.running = True
self.thread = Thread(target=self.update, args=())
self.thread.start()
return self
def update(self):
while self.running:
_, frame = self.stream.read()
self.lock.acquire()
self.frame = frame
self.lock.release()
def read(self, encode=False):
self.lock.acquire()
frame = self.frame.copy()
self.lock.release()
if encode:
_, buffer = imencode(".jpeg", frame)
return base64.b64encode(buffer)
return frame
def stop(self):
self.running = False
if self.thread.is_alive():
self.thread.join()
def __exit__(self, exc_type, exc_value, exc_traceback):
self.stream.release()
class Assistant:
def __init__(self, model):
self.chain = self._create_inference_chain(model)
def answer(self, prompt, image):
if not prompt:
return
print("Prompt:", prompt)
response = self.chain.invoke(
{"prompt": prompt, "image_base64": image.decode()},
config={"configurable": {"session_id": "unused"}},
).strip()
print("Response:", response)
if response:
self._tts(response)
def _tts(self, response):
# Simulate TTS: normally you'd use a library or API here
print(f"TTS: {response}")
def _create_inference_chain(self, model):
SYSTEM_PROMPT = """
You are a witty assistant that will use the chat history and the image
provided by the user to answer its questions. Your job is to answer
questions.
Use few words on your answers. Go straight to the point. Do not use any
emoticons or emojis.
Be friendly and helpful. Show some personality.
"""
prompt_template = ChatPromptTemplate.from_messages(
[
SystemMessage(content=SYSTEM_PROMPT),
MessagesPlaceholder(variable_name="chat_history"),
(
"human",
[
{"type": "text", "text": "{prompt}"},
{
"type": "image_url",
"image_url": "data:image/jpeg;base64,{image_base64}",
},
],
),
]
)
chain = prompt_template | model | StrOutputParser()
chat_message_history = ChatMessageHistory()
return RunnableWithMessageHistory(
chain,
lambda _: chat_message_history,
input_messages_key="prompt",
history_messages_key="chat_history",
)
def main():
st.title("AI Assistant with Webcam Stream")
# Instantiate Webcam Stream and start it
webcam_stream = WebcamStream().start()
# model = ChatGoogleGenerativeAI(model="gemini-1.5-flash-latest")
# You can use OpenAI's GPT-4o model instead of Gemini Flash by uncommenting the following line:
model = ChatOpenAI(model="gpt-4o")
assistant = Assistant(model)
# UI for webcam feed
st.subheader("Webcam Feed")
def run_webcam():
while True:
frame = webcam_stream.read()
_, buffer = cv2.imencode('.jpg', frame)
frame_data = base64.b64encode(buffer).decode('utf-8')
# Display frame in Streamlit app
st.image(f"data:image/jpeg;base64,{frame_data}", use_column_width=True)
st.experimental_rerun()
webcam_thread = Thread(target=run_webcam)
webcam_thread.start()
st.subheader("Ask the Assistant")
prompt = st.text_input("Enter your question:")
if st.button("Submit"):
if prompt:
assistant.answer(prompt, webcam_stream.read(encode=True))
else:
st.warning("Please enter a prompt to submit.")
if st.button("Stop Webcam"):
webcam_stream.stop()
cv2.destroyAllWindows()
if __name__ == "__main__":
main() |