|
import pronouncing |
|
import string |
|
import copy |
|
import gradio as gr |
|
|
|
CONSONANTS = set(string.ascii_uppercase) - set('AEIOU') |
|
|
|
def get_phones(word): |
|
phones_for_word = pronouncing.phones_for_word(word) |
|
if not phones_for_word: |
|
return None |
|
phones = phones_for_word[0].split() |
|
return phones |
|
|
|
def _get_rhyming_tail(phones, syllable_count=2): |
|
vowels = [phone for phone in phones if phone[0] in 'AEIOU'] |
|
if len(vowels) < syllable_count: |
|
return None |
|
return phones[-syllable_count * 2:] |
|
|
|
def get_multisyllabic_rhymes(phones, syllable_count=2): |
|
rhyming_tail = _get_rhyming_tail(phones, syllable_count) |
|
if not rhyming_tail: |
|
return [] |
|
rhyming_tail_str = " ".join(rhyming_tail) |
|
return pronouncing.search(rhyming_tail_str + "$") |
|
|
|
def find_rhymes_for_words(words, syllable_count=2): |
|
|
|
words = words.split() |
|
results = {} |
|
|
|
for word in words: |
|
phones = get_phones(word) |
|
if phones is None: |
|
results[word] = 'Not recognized' |
|
continue |
|
|
|
multisyllabic_rhymes = get_multisyllabic_rhymes(phones, syllable_count) |
|
results[word] = multisyllabic_rhymes if multisyllabic_rhymes else "No multisyllabic rhymes found" |
|
|
|
|
|
result_str = "" |
|
for word, rhymes in results.items(): |
|
if isinstance(rhymes, list): |
|
result_str += f"{word.capitalize()} ({syllable_count} syllables): " + ", ".join(rhymes) + "\n\n" |
|
else: |
|
result_str += f"{word.capitalize()}: {rhymes}\n\n" |
|
|
|
return result_str |
|
|
|
|
|
iface = gr.Interface( |
|
fn=lambda words, syllables: find_rhymes_for_words(words, syllables), |
|
inputs=[ |
|
gr.inputs.Textbox(label="Enter words (space-separated)"), |
|
gr.inputs.Slider(1, 3, step=1, label="Number of Syllables") |
|
], |
|
outputs="text", |
|
description="Enter multiple words separated by spaces to find multisyllabic rhymes." |
|
) |
|
|
|
if __name__ == "__main__": |
|
iface.launch() |
|
|