File size: 4,352 Bytes
9fde8e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ead746c
9fde8e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7dcdfbb
9fde8e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Importing necessary libraries:
import wave # Handles WAV audio files
import io   # Input/Output operations, helps with working with data in memory

# Libraries for speech recognition and language processing:
import speech_recognition as sr # Speech recognition capabilities
from groq import Groq # Groq client for interacting with Groq AI platform 
import numpy as np # Powerful numerical computations (handling audio data)
from scipy.io.wavfile import write # Writing audio files
import librosa # Audio analysis (resampling audio)

# Vectorstore and language model interactions:
from langchain_community.vectorstores import FAISS # Efficient similarity search for documents
from langchain_huggingface import HuggingFaceEmbeddings # Embeddings for language models
import streamlit as st # Creating interactive web applications

# Downsample audio from 96kHz to 44kHz (common for many applications)
def downsample_audio(audio_data):
    # Convert audio data to suitable format for librosa
    audio_data = audio_data.astype(np.float32)

    # Resample the audio, changing sample rate from 96000 to 44000
    resampled_audio = librosa.resample(audio_data, orig_sr=96000, target_sr=44000)

    # Save the resampled audio as a WAV file named 'aud.wav'
    write('aud.wav', 44000, resampled_audio.astype(np.int16))

# Save audio received as bytes (often from web interfaces) to a file
def save_audio_from_bytes(audio_bytes):
    # Convert audio bytes into a NumPy array (easier to work with)
    audio_array = np.frombuffer(audio_bytes, dtype=np.int16)

    # Save the original (high-sample-rate) audio as 'audio.wav'
    write('audio.wav', 96000, audio_array)

    # Downsample the audio for further processing
    downsample_audio(audio_array)

# Interact with Groq AI platform to get responses from a language model
def run_groq(prompt, model):
    # Truncate the prompt if using 'llama2-70b-chat' model
    if model == 'llama3-70b-8192':
        prompt = prompt[:8191]

    # Create a Groq client (you'll need an API key)
    client = Groq(api_key='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')

    # Send the prompt to the specified language model on Groq
    chat_completion = client.chat.completions.create(
        messages=[
            {'role': 'user', 'content': prompt}
        ],
        model=model
    )

    # Return the generated response from the model
    return chat_completion.choices[0].message.content

# Transcribe audio from the 'aud.wav' file (assumes Spanish language)
def transcript():
    # Create a speech recognizer object
    recognizer = sr.Recognizer()

    # Open the audio file 'aud.wav'
    with sr.AudioFile('aud.wav') as source:
        # Read the audio data from the file
        audio = recognizer.record(source)

    # Use Google's speech recognition to transcribe the audio (Spanish)
    text = recognizer.recognize_google(audio, language='en')

    # Return the transcribed text
    return text

# Perform Retrieval Augmented Generation (RAG) to answer queries using context
def run_rag(query, vc):  # 'vc' is assumed to be a Vectorstore
    # Find similar documents in the Vectorstore based on the query
    similar_docs = vc.similarity_search(query, k=10)  # Get top 10 similar docs

    # Combine the content of these similar documents into a single context
    context = '\n'.join([doc.page_content for doc in similar_docs])

    # Display the context in the Streamlit sidebar
    st.sidebar.write(context)

    # Construct a prompt for the language model, including the context
    prompt = f'''
Your name is Emma and you are a virtual physiotherapist ,use the following context as your learned knowledge, inside <context></context> XML tags.
<context>
    {context}
</context>

The context is taken from a set of pdfs 

When answer to user:
- If you don't know, just say that you don't know.
- If you don't know when you are not sure, ask for clarification.
Avoid mentioning that you obtained the information from the context.
And answer according to the language of the user's question.
Make your answers detailed

- Return yout answer in Spanish

Given the context information, answer the query.
Query: {query}
    '''

    # Get a response from the 'llama2-70b-chat' model on Groq
    response = run_groq(prompt, 'llama3-70b-8192')

    # Return the generated response
    return response