File size: 3,551 Bytes
86bb974
 
 
 
 
e710610
 
86bb974
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f587689
 
 
 
 
 
e710610
86bb974
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc935e3
86bb974
 
 
 
 
bc935e3
86bb974
 
 
 
f587689
bc935e3
86bb974
e710610
86bb974
 
 
 
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
import gradio as gr
from transformers import pipeline
import json
from difflib import SequenceMatcher

# Load pre-trained Arabic speech-to-text model
recognizer = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-large-xlsr-53-arabic")

# Load Qur'an verses from JSON file
with open('quran_verses.json', 'r', encoding='utf-8') as f:
    quran_verses = json.load(f)["verses"]

# Load user progress
try:
    with open('user_progress.json', 'r', encoding='utf-8') as f:
        user_progress = json.load(f)
except FileNotFoundError:
    user_progress = {"memorized_verses": []}

# Function to calculate the similarity between two texts
def calculate_similarity(a, b):
    return SequenceMatcher(None, a, b).ratio()

# Function to update user progress
def update_progress(verse):
    if verse not in user_progress["memorized_verses"]:
        user_progress["memorized_verses"].append(verse)
        with open('user_progress.json', 'w', encoding='utf-8') as f:
            json.dump(user_progress, f, indent=4)

# Function to calculate progress percentage
def calculate_progress():
    total_verses = len(quran_verses)
    memorized_verses = len(user_progress["memorized_verses"])
    return (memorized_verses / total_verses) * 100

# Function to provide detailed feedback based on similarity score
def get_feedback(similarity):
    if similarity > 0.9:
        return "Excellent! Your recitation is almost perfect!"
    elif similarity > 0.75:
        return "Good job! You’re getting close, but there’s room for improvement."
    elif similarity > 0.5:
        return "Not bad, but practice some more to improve accuracy."
    else:
        return "Keep practicing, and try again!"

# Function to process audio and match it with the closest Qur'an verse
def process_audio(audio):
    print(f"Audio Input: {audio}")
    
    # Check if audio is None
    if audio is None:
        return "No audio file provided. Please upload or record an audio."
    
    # Transcribe the audio using the Arabic model
    transcription = recognizer(audio)["text"]
    
    # Find the most similar verse
    most_similar_verse = None
    highest_similarity = 0
    for verse in quran_verses:
        similarity = calculate_similarity(transcription, verse["text"])
        if similarity > highest_similarity:
            highest_similarity = similarity
            most_similar_verse = verse

    # Update progress if the match is good enough
    if most_similar_verse and highest_similarity > 0.8:  # Threshold of 80% similarity
        update_progress(most_similar_verse)
        progress = calculate_progress()
        feedback = get_feedback(highest_similarity)
        return (
            f"Transcription: {transcription}\n"
            f"Closest verse: {most_similar_verse['text']}\n"
            f"Similarity: {highest_similarity * 100:.2f}%\n"
            f"Feedback: {feedback}\n"
            f"Progress: {progress:.2f}%"
        )
    else:
        return (
            f"Transcription: {transcription}\n"
            f"No matching verse found or similarity too low.\n"
            f"Progress: {calculate_progress():.2f}%"
        )

# Interface
iface = gr.Interface(
    fn=process_audio, 
    inputs=gr.Audio(type="filepath"),  # You can change this to "numpy" if needed
    outputs=gr.Textbox(),  # Only use a Textbox to display progress and feedback
    title="Qur'an Memorization Helper",
    description="Speak a verse in Arabic, and we'll transcribe it, check your accuracy, and track your progress."
)

# Launch the app
iface.launch()