10 KiB
تبدیل متن به گفتار - رزبری پای
در این بخش از درس، شما کدی خواهید نوشت که متن را با استفاده از سرویس گفتار به گفتار تبدیل کند.
تبدیل متن به گفتار با استفاده از سرویس گفتار
متن میتواند با استفاده از API REST به سرویس گفتار ارسال شود تا به صورت یک فایل صوتی دریافت شود که میتوان آن را روی دستگاه IoT شما پخش کرد. هنگام درخواست گفتار، باید صدایی که میخواهید استفاده کنید را مشخص کنید، زیرا گفتار میتواند با استفاده از انواع مختلف صداها تولید شود.
هر زبان از مجموعهای از صداهای مختلف پشتیبانی میکند و شما میتوانید یک درخواست 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
دریافت کردید، این مقدار را به مقدار دیگری تغییر دهید. لیست مقادیر پشتیبانیشده را میتوانید در مستندات API REST تبدیل متن به گفتار در Microsoft Docs پیدا کنید. شما باید از فرمت صوتیriff
استفاده کنید و مقادیر قابل امتحان عبارتند ازriff-16khz-16bit-mono-pcm
،riff-24khz-16bit-mono-pcm
وriff-48khz-16bit-mono-pcm
. -
در زیر این بخش، یک تابع به نام
get_speech
تعریف کنید که متن را با استفاده از API REST سرویس گفتار به گفتار تبدیل کند: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 را که باید به API REST ارسال شود تعریف کنید:
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
، یک تابع جدید برای پخش صوت بازگرداندهشده توسط فراخوانی API REST تعریف کنید:def play_speech(speech):
-
صوتی که به این تابع ارسال میشود دادههای صوتی باینری بازگرداندهشده از API REST خواهد بود. از کد زیر استفاده کنید تا این دادهها را به عنوان یک فایل 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 ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.