2025, Oct 23 05:31

Tkinter में pyttsx3 से खाली MP3? macOS पर gTTS से हल

macOS पर Tkinter ऐप में pyttsx3 से बनी शून्य-बाइट MP3 समस्या का कारण और समाधान: asksaveasfilename अपनाएँ, gTTS से वैध MP3 बनाकर सेव करें. चरण समझाएँ गए हैं.

जब आप Tkinter ऐप में जल्दी से टेक्स्ट-टू-स्पीच फ्लो जोड़ते हैं, तो अक्सर लगता है कि सेव करने का चरण मामूली होगा। लेकिन एक आम समस्या यह है कि MP3 फ़ाइल बन तो जाती है, पर शून्य-बाइट/खाली रहती है और उसमें ऑडियो नहीं होता। macOS पर साधारण pyttsx3 सेटअप के आधार पर नीचे दिए गए स्निपेट में यही होता है।

समस्या सेटअप

इरादा स्पष्ट है: उपयोगकर्ता से गंतव्य पूछना और pyttsx3 से उसी फ़ाइल में स्पीच बनवाना। नतीजा, हालांकि, मौजूद फ़ाइल के बावजूद खाली MP3 रहता है।

out_target = filedialog.asksaveasfile(filetypes=(("MP3 files", "*.mp3"),
                                                ("All files", "*.*")))  # उपयोगकर्ता से पथ पूछें
speech_engine = pyttsx3.init()  # इंजन बनाएं
speech_engine.setProperty('rate', 100)  # बोलने की गति सेट करें
speech_engine.save_to_file('Hi and welcome to my audiobook.', out_target)  # ऑडियो सेव करने का प्रयास
speech_engine.runAndWait()

यह व्यवहार तब भी बना रहता है जब स्निपेट दस्तावेज़ के उदाहरणों जैसा ही हो। यहां का वातावरण macOS है, और espeak-ng की स्थापना इस सेटअप का हिस्सा नहीं है।

क्या हो रहा है

नतीजा साफ दिखता है—MP3 फ़ाइल खाली है। इस कॉन्फ़िगरेशन में समस्या दोहराई जा सकती है। संदर्भ से दो व्यावहारिक बातें निकलती हैं। पहला, ऊपर फ़ाइल डायलॉग में asksaveasfile इस्तेमाल किया गया है; नोट यह सुझाता है कि इसकी जगह asksaveasfilename लें। दूसरा, gTTS पर स्विच करना कारगर विकल्प साबित होता है और टेक्स्ट से MP3 तक का रास्ता आसान कर देता है।

काम करने वाला विकल्प

सेव डायलॉग कॉल बदलकर और pyttsx3 की जगह gTTS रखने से एक छोटा‑सा समाधान मिलता है जो मान्य MP3 लिखता है। समझौता यह है कि इस तरीके में गति और अन्य सूक्ष्म सेटिंग्स तय नहीं की जा रही हैं।

out_path = filedialog.asksaveasfilename(filetypes=(("MP3 files", "*.mp3"),
                                                 ("All files", "*.*")))  # गंतव्य पथ प्राप्त करें
speech_obj = gTTS(text=text, lang='en')  # gTTS ऑब्जेक्ट बनाएँ
speech_obj.save(out_path)  # चुने गए स्थान पर MP3 लिखें

इससे फ़ाइल नाम के लिए वही UI प्रॉम्प्ट बना रहता है और ऑडियो बनाने के लिए gTTS का उपयोग होता है। जैसा उल्लेख किया गया, इस स्थिति में gTTS इस्तेमाल करना आसान है, जबकि pyttsx3 गति और अन्य गुण समायोजित करने देता है।

यह जानकारी क्यों महत्वपूर्ण है

गंतव्य प्राप्त करने के तरीके और लाइब्रेरी उसे किस रूप में चाहती है—इन सूक्ष्म फर्कों की वजह से फ़ाइल तो बन सकती है, पर उसमें वैध सामग्री न हो। लक्षण पहचानना—खाली MP3—और यह जानना कि फ़ाइलनाम‑आधारित प्रॉम्प्ट पर स्विच करके gTTS इस्तेमाल करना एक व्यावहारिक राह है, समय बचाता है। यह अपेक्षाएँ भी साफ करता है: यदि आपको rate जैसी सेटिंग्स ट्यून करनी हों, तो pyttsx3 वह लचीलापन देता है, जबकि यहां दिखाया गया सरल फ्लो तेज और भरोसेमंद आउटपुट पर जोर देता है।

मुख्य बातें

यदि macOS पर Tkinter + TTS वर्कफ़्लो में खाली MP3 मिल रही हो, तो दो चीज़ों पर तुरंत ध्यान दें। सेव डायलॉग के लिए asksaveasfilename को प्राथमिकता दें, और रूपांतरण पाइपलाइन को सरल करने के लिए gTTS पर विचार करें। अगर गति अनुकूलन जरूरी है, तो याद रखें कि pyttsx3 ये समायोजन देता है, जबकि दिखाया गया gTTS फ्लो पैरामीटर ट्यूनिंग से ज़्यादा सादगी को प्राथमिकता देता है।

यह लेख StackOverflow के प्रश्न पर आधारित है, जिसे Aadvik ने पूछा और उत्तर भी Aadvik ने दिया।