|
import speech_recognition as sr |
|
from langchain.llms import HuggingFacePipeline |
|
from langchain.chains import RetrievalQA |
|
from langchain.embeddings import HuggingFaceEmbeddings |
|
from langchain.vectorstores import FAISS |
|
from langchain.document_loaders import UnstructuredFileLoader |
|
|
|
import os |
|
import torch |
|
|
|
import soundfile as sf |
|
from playsound import playsound |
|
from TTS.api import TTS |
|
from langchain.llms import Ollama |
|
|
|
|
|
|
|
loader = UnstructuredFileLoader("Foduu_KnowledgeBase.pdf") |
|
documents = loader.load() |
|
|
|
|
|
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") |
|
vectorstore = FAISS.from_documents(documents, embeddings) |
|
|
|
ollama = Ollama(base_url='http://localhost:11434',model="llama3") |
|
qa = RetrievalQA.from_chain_type(llm=ollama, chain_type="stuff", retriever=vectorstore.as_retriever()) |
|
|
|
|
|
r = sr.Recognizer() |
|
|
|
tts = TTS(model_name="tts_models/en/ljspeech/glow-tts") |
|
|
|
|
|
|
|
def speak(text): |
|
""" |
|
Converts text to speech using Mozilla TTS, plays the audio, and then deletes the file. |
|
""" |
|
try: |
|
|
|
output_file = "output.wav" |
|
tts.tts_to_file(text=text, file_path=output_file) |
|
|
|
|
|
playsound(output_file) |
|
os.remove(output_file) |
|
print(f"Speech played and file {output_file} removed.") |
|
|
|
except Exception as e: |
|
print(f"Error: {e}") |
|
|
|
|
|
def listen(): |
|
""" |
|
Records audio and converts it to text using speech recognition. |
|
""" |
|
with sr.Microphone() as source: |
|
print("Listening...") |
|
audio = r.listen(source) |
|
try: |
|
text = r.recognize_google(audio) |
|
print(f"You said: {text}") |
|
return text |
|
except sr.UnknownValueError: |
|
print("Could not understand audio") |
|
speak('could not understand audio') |
|
return None |
|
except sr.RequestError as e: |
|
print(f"Could not request results from Google Speech Recognition service; {e}") |
|
return None |
|
|
|
|
|
def process_audio(text): |
|
if text is not None: |
|
try: |
|
response = qa.run(text) |
|
print(response) |
|
speak(response) |
|
except Exception as e: |
|
print(f"An error occurred: {e}") |
|
speak("Sorry, I'm having trouble processing that right now.") |
|
|
|
|
|
def main(): |
|
""" |
|
Main loop for the voice assistant. |
|
""" |
|
while True: |
|
text = listen() |
|
process_audio(text) |
|
|
|
|
|
if __name__ == "__main__": |
|
main() |
|
|