def match_phones(phones, meter): beats = segment_beats(phones) lobeat, hibeat = argh(beats) v, nvowels = 0, len(beats) p, nphones = 0, len(phones) for j, m in enumerate(meter): if nphones <= p: return meter[j+1:], None if m == rhymed: # NB we assume a rhymed may only appear once, at the end of meter # XXX I think this is not quite right: e.g. 'intelligible' # against meter (0,1,0,rhymed) produces rhyme 'gible' here, # but it should fail: return match_as_rhyme(phones[p:], lobeat, hibeat) while not pronounce.is_vowel(phones[p]): p += 1 if nphones <= p: return None, None if not match_beat(int(phones[p][-1]), m, lobeat, hibeat): # XXX let's try a special case improvement until we can # better it: if beats == [1, 0, 0] and meter[:3] == (1, 0, 1): return meter[3:], None return None, None p += 1 v += 1 if v == nvowels: return meter[j+1:], None return (), None # XXX shouldn't this be None, None?
def find_rime(phones): assert isinstance(phones, tuple), "phones: %r" % phones for i, ph in enumerate(phones): if pronounce.is_vowel(ph): return i assert False
def segment_beats(phones): return [int(phone[-1]) for phone in phones if pronounce.is_vowel(phone)]