else:jyutping_cache[hanzi]=jyutping=S(espeak.transliterate("zhy",hanzi,forPartials=0)).replace("7","1").lower()# .lower() needed because espeak sometimes randomly capitalises e.g. 2nd hanzi of 'hypocrite' (Mandarin xuwei de ren)
ifhanziincache:jyutping=cache[hanzi]
else:cache[hanzi]=jyutping=S(espeak.transliterate("zhy",hanzi,forPartials=0)).replace("7","1").lower()# .lower() needed because espeak sometimes randomly capitalises e.g. 2nd hanzi of 'hypocrite' (Mandarin xuwei de ren)
ifmustWork:assertjyutping.strip(),"No translit. result for "+repr(hanzi)
else:py2=espeak.transliterate("zh",pinyin,forPartials=0)# (this transliterate just does tone marks to numbers, adds 5, etc; forPartials=0 because we DON'T want to change letters like X into syllables, as that won't happen in jyutping and we're going through it tone-by-tone)
assertpy2andpy2.strip(),"espeak.transliterate returned %s for %s"%(repr(py2),repr(pinyin))