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 # Not enough syllables for a multisyllabic rhyme 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): # Split words by spaces 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" # Format results as a string 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 # Gradio interface 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()