9.0 KiB
تحويل النص إلى كلام - Raspberry Pi
في هذا الجزء من الدرس، ستقوم بكتابة كود لتحويل النص إلى كلام باستخدام خدمة الكلام.
تحويل النص إلى كلام باستخدام خدمة الكلام
يمكن إرسال النص إلى خدمة الكلام باستخدام واجهة REST API للحصول على الكلام كملف صوتي يمكن تشغيله على جهاز إنترنت الأشياء الخاص بك. عند طلب الكلام، تحتاج إلى تحديد الصوت الذي سيتم استخدامه، حيث يمكن توليد الكلام باستخدام مجموعة متنوعة من الأصوات المختلفة.
كل لغة تدعم مجموعة من الأصوات المختلفة، ويمكنك إرسال طلب REST إلى خدمة الكلام للحصول على قائمة الأصوات المدعومة لكل لغة.
المهمة - الحصول على صوت
-
افتح مشروع
smart-timer
في VS Code. -
أضف الكود التالي فوق دالة
say
لطلب قائمة الأصوات للغة معينة:def get_voice(): url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/voices/list' headers = { 'Authorization': 'Bearer ' + get_access_token() } response = requests.get(url, headers=headers) voices_json = json.loads(response.text) first_voice = next(x for x in voices_json if x['Locale'].lower() == language.lower() and x['VoiceType'] == 'Neural') return first_voice['ShortName'] voice = get_voice() print(f'Using voice {voice}')
يقوم هذا الكود بتعريف دالة تسمى
get_voice
تستخدم خدمة الكلام للحصول على قائمة الأصوات. ثم يعثر على أول صوت يتطابق مع اللغة المستخدمة.يتم استدعاء هذه الدالة لتخزين أول صوت، ويتم طباعة اسم الصوت إلى وحدة التحكم. يمكن طلب هذا الصوت مرة واحدة واستخدام القيمة لكل استدعاء لتحويل النص إلى كلام.
💁 يمكنك الحصول على القائمة الكاملة للأصوات المدعومة من وثائق دعم اللغة والصوت على Microsoft Docs. إذا كنت ترغب في استخدام صوت معين، يمكنك إزالة هذه الدالة وتحديد الصوت يدويًا باستخدام اسم الصوت من هذه الوثائق. على سبيل المثال:
voice = 'hi-IN-SwaraNeural'
المهمة - تحويل النص إلى كلام
-
أسفل هذا، قم بتعريف ثابت لتنسيق الصوت الذي سيتم استرداده من خدمات الكلام. عند طلب الصوت، يمكنك القيام بذلك بمجموعة من التنسيقات المختلفة.
playback_format = 'riff-48khz-16bit-mono-pcm'
يعتمد التنسيق الذي يمكنك استخدامه على جهازك. إذا واجهت أخطاء
Invalid sample rate
عند تشغيل الصوت، قم بتغيير هذا إلى قيمة أخرى. يمكنك العثور على قائمة القيم المدعومة في وثائق REST API لتحويل النص إلى كلام على Microsoft Docs. ستحتاج إلى استخدام صوت بتنسيقriff
، والقيم التي يمكنك تجربتها هيriff-16khz-16bit-mono-pcm
،riff-24khz-16bit-mono-pcm
وriff-48khz-16bit-mono-pcm
. -
أسفل هذا، قم بتعريف دالة تسمى
get_speech
لتحويل النص إلى كلام باستخدام REST API لخدمة الكلام:def get_speech(text):
-
في دالة
get_speech
، قم بتعريف عنوان URL الذي سيتم استدعاؤه والرؤوس التي سيتم تمريرها:url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/v1' headers = { 'Authorization': 'Bearer ' + get_access_token(), 'Content-Type': 'application/ssml+xml', 'X-Microsoft-OutputFormat': playback_format }
يتم هنا إعداد الرؤوس لاستخدام رمز وصول تم إنشاؤه، وتحديد المحتوى كـ SSML وتحديد تنسيق الصوت المطلوب.
-
أسفل هذا، قم بتعريف SSML الذي سيتم إرساله إلى REST API:
ssml = f'<speak version=\'1.0\' xml:lang=\'{language}\'>' ssml += f'<voice xml:lang=\'{language}\' name=\'{voice}\'>' ssml += text ssml += '</voice>' ssml += '</speak>'
يقوم هذا SSML بتحديد اللغة والصوت المستخدم، بالإضافة إلى النص الذي سيتم تحويله.
-
أخيرًا، أضف كودًا في هذه الدالة لإجراء طلب REST وإرجاع البيانات الصوتية الثنائية:
response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) return io.BytesIO(response.content)
المهمة - تشغيل الصوت
-
أسفل دالة
get_speech
، قم بتعريف دالة جديدة لتشغيل الصوت الذي تم إرجاعه من استدعاء REST API:def play_speech(speech):
-
الصوت
speech
الذي يتم تمريره إلى هذه الدالة سيكون البيانات الصوتية الثنائية التي تم إرجاعها من REST API. استخدم الكود التالي لفتح هذا كملف wave وتمريره إلى PyAudio لتشغيل الصوت:def play_speech(speech): with wave.open(speech, 'rb') as wave_file: stream = audio.open(format=audio.get_format_from_width(wave_file.getsampwidth()), channels=wave_file.getnchannels(), rate=wave_file.getframerate(), output_device_index=speaker_card_number, output=True) data = wave_file.readframes(4096) while len(data) > 0: stream.write(data) data = wave_file.readframes(4096) stream.stop_stream() stream.close()
يستخدم هذا الكود تدفق PyAudio، تمامًا مثل التقاط الصوت. الفرق هنا هو أن التدفق يتم إعداده كتدفق إخراج، ويتم قراءة البيانات من البيانات الصوتية ودفعها إلى التدفق.
بدلاً من تحديد تفاصيل التدفق مثل معدل العينة يدويًا، يتم قراءتها من البيانات الصوتية.
-
استبدل محتويات دالة
say
بالتالي:speech = get_speech(text) play_speech(speech)
يقوم هذا الكود بتحويل النص إلى كلام كبيانات صوتية ثنائية، ثم يقوم بتشغيل الصوت.
-
قم بتشغيل التطبيق، وتأكد من تشغيل تطبيق الوظيفة أيضًا. قم بضبط بعض المؤقتات، وستسمع استجابة صوتية تخبرك بأنه تم ضبط المؤقت الخاص بك، ثم استجابة صوتية أخرى عند انتهاء المؤقت.
إذا واجهت أخطاء
Invalid sample rate
، قم بتغييرplayback_format
كما هو موضح أعلاه.
💁 يمكنك العثور على هذا الكود في المجلد code-spoken-response/pi.
😀 لقد كان برنامج المؤقت الخاص بك ناجحًا!
إخلاء المسؤولية:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي Co-op Translator. بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.