phonolearn / TaiwaneseHokkien.py
etchen's picture
Create TaiwaneseHokkien.py
c85be9e verified
raw
history blame
2.94 kB
from LanguageBase import Language
from taibun import Converter
model_repo_id = "emlinking/wav2vec2-large-xls-r-300m-tsm-asr-v6"
util = Converter()
def get_initial_length(s):
if s[2] == 'h':
return 3
elif s[1] in ['s', 'h']:
return 2
else:
return 1
class TaiwaneseHokkien(Language):
def __init__(self, **kwargs):
self.pipe = pipeline(task="automatic-speech-recognition", model=model_repo_id, **kwargs)
def asr(self, audio):
return self.pipe(audio)['text']
def compare(self, target_pron, user_pron):
# normalize
target_pron = target_pron.lower().split()
user_pron = user_pron.lower().split()
result = []
for i in min(len(target_pron), len(user_pron)):
target_syls = [x for x in target_pron[i].split('-') if x]
user_syls = [x for x in user_pron[i].split('-') if x]
for j in min(len(target_syls), len(user_syls));
target_syl = util._Converter__get_number_tone(target_syls[i])
user_syl = util._Converter__get_number_tone(user_syls[i])
til = get_initial_length(target_syl)
uil = get_initial_length(user_syl)
if target_syl[:til] != user_syl[:uil]:
result.append((user_syl[:uil], 'initial error'))
else:
result.append((user_syl[:uil], None))
if target_syl[til:-1] != user_syl[uil:-1]:
result.append((user_syl[uil:-1], 'rime error'))
else:
result.append((user_syl[uil:-1], None))
if target_syl[-1] != user_syl[-1]:
result.append((user_syl[-1], 'tone error'))
else:
result.append((user_syl[-1], None))
if j < min(len(target_syls), len(user_syls))-1:
result.append(('-', None))
if len(target_syls) > len(user_syls):
for syl in target_syls[len(user_syls):]:
result.append(('-' + syl, 'missing syllables'))
elif len(user_syls) > len(target_syls):
for syl in user_syls[len(target_syls):]:
result.append(('-' + syl, 'extra syllables'))
result.append((' ', None))
if len(target_pron) > len(user_pron):
for word in target_pron[len(user_pron):]:
result.append((word, 'missing syllables'))
result.append((' ', None))
elif len(user_pron) > len(target_pron):
for word in user_pron[len(target_pron):]:
result.append((word, 'extra syllables'))
result.append((' ', None))
return result
@property
def compare_colors(self):
return {'tone error': 'red', 'initial error', 'blue', 'rime error': 'green', 'missing syllables': 'yellow', 'extra syllables': 'stone'}