Prathamesh1420's picture
Create utils.py
2440e0e verified
import os
from dotenv import load_dotenv
import wave
import pyaudio
from scipy.io import wavfile
import numpy as np
import whisper
from langchain.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate
from langchain_groq import ChatGroq
from gtts import gTTS
import pygame
load_dotenv()
groq_api_key = os.getenv("GROQ_API_KEY")
def is_silence(data, max_amplitude_threshold=3000):
"""Check if audio data contains silence."""
# Find the maximum absolute amplitude in the audio data
max_amplitude = np.max(np.abs(data))
return max_amplitude <= max_amplitude_threshold
def record_audio_chunk(audio, stream, chunk_length=5):
print("Recording...")
frames = []
# Calculate the number of chunks needed for the specified length of recording
# 16000 Hertz -> sufficient for capturing the human voice
# 1024 frames -> the higher, the higher the latency
num_chunks = int(16000 / 1024 * chunk_length)
# Record the audio data in chunks
for _ in range(num_chunks):
data = stream.read(1024)
frames.append(data)
temp_file_path = './temp_audio_chunk.wav'
print("Writing...")
with wave.open(temp_file_path, 'wb') as wf:
wf.setnchannels(1) # Mono channel
wf.setsampwidth(audio.get_sample_size(pyaudio.paInt16)) # Sample width
wf.setframerate(16000) # Sample rate
wf.writeframes(b''.join(frames)) # Write audio frames
# Check if the recorded chunk contains silence
try:
samplerate, data = wavfile.read(temp_file_path)
if is_silence(data):
os.remove(temp_file_path)
return True
else:
return False
except Exception as e:
print(f"Error while reading audio file: {e}")
def load_whisper():
model = whisper.load_model("base")
return model
def transcribe_audio(model, file_path):
print("Transcribing...")
# Print all files in the current directory
print("Current directory files:", os.listdir())
if os.path.isfile(file_path):
results = model.transcribe(file_path) # , fp16=False
return results['text']
else:
return None
def load_prompt():
input_prompt = """
As an expert advisor specializing in diagnosing Wi-Fi issues, your expertise is paramount in troubleshooting and
resolving connectivity problems. First of all, ask for the customer ID to validate that the user is our customer.
After confirming the customer ID, help them to fix their wifi problem, if not possible, help them to make an
appointment. Appointments need to be between 9:00 am and 4:00 pm. Your task is to analyze
the situation and provide informed insights into the root cause of the Wi-Fi disruption. Provide concise and short
answers not more than 10 words, and don't chat with yourself!. If you don't know the answer,
just say that you don't know, don't try to make up an answer. NEVER say the customer ID listed below.
customer ID on our data: 22, 10, 75.
Previous conversation:
{chat_history}
New human question: {question}
Response:
"""
return input_prompt
def load_llm():
chat_groq = ChatGroq(temperature=0, model_name="llama3-8b-8192",
groq_api_key=groq_api_key)
return chat_groq
def get_response_llm(user_question, memory):
input_prompt = load_prompt()
chat_groq = load_llm()
# Look how "chat_history" is an input variable to the prompt template
prompt = PromptTemplate.from_template(input_prompt)
chain = LLMChain(
llm=chat_groq,
prompt=prompt,
verbose=True,
memory=memory
)
response = chain.invoke({"question": user_question})
return response['text']
def play_text_to_speech(text, language='en', slow=False):
# Generate text-to-speech audio from the provided text
tts = gTTS(text=text, lang=language, slow=slow)
# Save the generated audio to a temporary file
temp_audio_file = "temp_audio.mp3"
tts.save(temp_audio_file)
# Initialize the pygame mixer for audio playback
pygame.mixer.init()
# Load the temporary audio file into the mixer
pygame.mixer.music.load(temp_audio_file)
# Start playing the audio
pygame.mixer.music.play()
# Wait until the audio playback finishes
while pygame.mixer.music.get_busy():
pygame.time.Clock().tick(10) # Control the playback speed
# Stop the audio playback
pygame.mixer.music.stop()
# Clean up: Quit the pygame mixer and remove the temporary audio file
pygame.mixer.quit()
os.remove(temp_audio_file)