Spaces:
Sleeping
Sleeping
File size: 4,362 Bytes
734a7ea d29fa84 734a7ea 175f7a3 734a7ea d29fa84 734a7ea c0b2049 175f7a3 734a7ea d29fa84 734a7ea d29fa84 18f99c6 d29fa84 43ce49e d29fa84 c03de5c d29fa84 43ce49e d29fa84 aab3ee4 c03de5c aab3ee4 c03de5c 471da93 c03de5c d29fa84 |
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 |
import random
from umsc import UgMultiScriptConverter
import string
import epitran
from difflib import SequenceMatcher
# Lists of Uyghur short and long texts
short_texts = [
"سالام", "رەھمەت", "ياخشىمۇسىز", "خۇش كېپسىز", "خەيرلىك كۈن", "خەير خوش"
]
long_texts = [
"مەكتەپكە بارغاندا تېخىمۇ بىلىملىك بولۇمەن.",
"يېزا مەنزىرىسى ھەقىقەتەن گۈزەل.",
"بىزنىڭ ئۆيدە تۆت تەكچە، تۆتىلىسى تەك-تەكچە",
"تۆۋەندە ئالىمنىڭ تەرجىمىھالى بىلەن تونۇشۇپ ئۆتەيلى.",
"شېئىردىكى تۇيغۇ ئورنىنى تاپالمىغان ئىستىلىستىكىلىق ۋاسىتە كۆزگە چېلىقمايدۇ."
]
# Front-End Utils
def generate_short_text(script_choice):
"""Generate a random Uyghur short text based on the type."""
ug_arab_to_latn = UgMultiScriptConverter('UAS', 'ULS')
text = random.choice(short_texts)
if script_choice == "Uyghur Latin":
return ug_arab_to_latn(text)
return text
def generate_long_text(script_choice):
"""Generate a random Uyghur long text based on the type."""
ug_arab_to_latn = UgMultiScriptConverter('UAS', 'ULS')
text = random.choice(long_texts)
if script_choice == "Uyghur Latin":
return ug_arab_to_latn(text)
return text
# ASR Utils
# def load_and_resample_audio(audio_data, target_rate):
# """Load audio and resample based on target sample rate"""
# if isinstance(audio_data, tuple):
# # microphone
# sampling_rate, audio_input = audio_data
# audio_input = (audio_input / 32768.0).astype(np.float32)
# elif isinstance(audio_data, str):
# # file upload
# audio_input, sampling_rate = torchaudio.load(audio_data)
# else:
# return "<<ERROR: Invalid Audio Input Instance: {}>>".format(type(audio_data))
# # Resample if needed
# if sampling_rate != target_rate:
# resampler = torchaudio.transforms.Resample(sampling_rate, target_rate)
# audio_input = resampler(audio_input)
# return audio_input, target_rate
def calculate_pronunciation_accuracy(reference_text, output_text, language_code='uig-Arab'):
"""
Calculate pronunciation accuracy between reference and ASR output text using Epitran.
Args:
reference_text (str): The ground truth text in Uyghur (Arabic script).
output_text (str): The ASR output text in Uyghur (Arabic script).
language_code (str): Epitran language code (default is 'uig-Arab' for Uyghur).
Returns:
float: Pronunciation accuracy as a percentage.
str: IPA transliteration of the reference text.
str: IPA transliteration of the output text.
"""
# Initialize Epitran for Uyghur (Arabic script)
ipa_converter = epitran.Epitran(language_code)
# Remove punctuation from both texts
reference_text_clean = remove_punctuation(reference_text)
output_text_clean = remove_punctuation(output_text)
# Transliterate both texts to IPA
reference_ipa = ipa_converter.transliterate(reference_text_clean)
output_ipa = ipa_converter.transliterate(output_text_clean)
# Calculate pronunciation accuracy using SequenceMatcher
matcher = SequenceMatcher(None, reference_text_clean, output_text_clean)
match_ratio = matcher.ratio() # This is the fraction of matching characters
# Convert to percentage
pronunciation_accuracy = match_ratio * 100
# Generate Markdown-compatible styled text
comparison_md = ""
for opcode, i1, i2, j1, j2 in matcher.get_opcodes():
ref_segment = reference_text_clean[i1:i2]
out_segment = output_text_clean[j1:j2]
if opcode == 'equal': # Matching characters
comparison_md += f'<span style="color: blue;">{ref_segment}</span>'
elif opcode in ['replace', 'delete', 'insert']: # Mismatched or missing
comparison_md += f'<span style="color: black;">{ref_segment}</span>'
comparison_md = f"<div>{comparison_md}</div>"
return reference_ipa, output_ipa, comparison_md, pronunciation_accuracy
def remove_punctuation(text):
"""Helper function to remove punctuation from text."""
return text.translate(str.maketrans('', '', string.punctuation)) |