# ពាក្យអក្សរទៅសូរ - Raspberry Pi នៅផ្នែកនេះនៃមេរៀន អ្នកនឹងសរសេរកូដដើម្បីបំលែងអក្សរទៅសូរដោយប្រើសេវាកម្មសូរ។ ## បំលែងអក្សរទៅសូរដោយប្រើសេវាកម្មសូរ អក្សរអាចត្រូវបានផ្ញើទៅសេវាកម្មសូរដោយប្រើ REST API ដើម្បីទទួលបានសូរជាកំណត់ត្រាអូឌីយោដែលអាចលេងឡើងវិញនៅលើឧបករណ៍ IoT របស់អ្នក។ នៅពេលស្នើសុំសូរ អ្នកត្រូវផ្ដល់សំឡេងដែលត្រូវប្រើ ដោយសូរអាចត្រូវបង្កើតដោយប្រើសំឡេងខុសៗគ្នាច្រើន។ ភាសាគ្រប់ភាសាចូលគាំទ្រសំឡេងច្រើនប្រភេទ ហើយអ្នកអាចធ្វើសំណើ REST ទៅសេវាកម្មសូរដើម្បីទទួលបានបញ្ជីសំឡេងដែលគាំទ្រសម្រាប់ភាសានីមួយៗ។ ### កិច្ចការនៃការទទួលបានសំឡេង 1. បើកគម្រោង `smart-timer` នៅក្នុង VS Code។ 1. បន្ថែមកូដខាងក្រោមនៅលើមុខមុខងារ `say` ដើម្បីស្នើសុំបញ្ជីសំឡេងសម្រាប់ភាសាមួយ៖ ```python 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](https://docs.microsoft.com/azure/cognitive-services/speech-service/language-support?WT.mc_id=academic-17441-jabenn#text-to-speech)។ ប្រសិនបើអ្នកចង់ប្រើសំឡេងជាក់លាក់ អ្នកអាចលុបមុខងារនេះហើយកូដក្រោមជាសំឡេងមួយពីឯកសារនេះ។ ឧទាហរណ៍៖ > > ```python > voice = 'hi-IN-SwaraNeural' > ``` ### កិច្ចការ - បំលែងអក្សរទៅសូរ 1. ចុះក្រោមនេះ សរសេរជាប់មួយថាសថេរសម្រាប់ទ្រង់ទ្រាយសម្លេងដែលត្រូវទទួលពីសេវាសូរ។ នៅពេលអ្នកស្នើសុំអូឌីយោ អ្នកអាចធ្វើបានជាទ្រង់ទ្រាយជាច្រើនផ្សេងៗ។ ```python playback_format = 'riff-48khz-16bit-mono-pcm' ``` ទ្រង់ទ្រាយដែលអ្នកអាចប្រើបានអាស្រ័យលើឧបករណ៍របស់អ្នក។ ប្រសិនបើទទួលបានកំហុស `Invalid sample rate` ពេលលេងអូឌីយោ សូមផ្លាស់ប្ដូរទៅតម្លៃផ្សេងទៀត។ អ្នកអាចស្វែងរកបញ្ជីតម្លៃគាំទ្រ​នៅ​ក្នុង [ឯកសារ Text to speech REST API នៅលើ Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/speech-service/rest-text-to-speech?WT.mc_id=academic-17441-jabenn#audio-outputs)។ អ្នកត្រូវប្រើអូឌីយោទ្រង់ទ្រាយ `riff` ហើយតម្លៃដែលអាចសាកល្បងជាចម្បងគឺ `riff-16khz-16bit-mono-pcm`, `riff-24khz-16bit-mono-pcm` និង `riff-48khz-16bit-mono-pcm`។ 1. ចុះក្រោមនេះ សរសេរមុខងារដែលមានឈ្មោះ `get_speech` ដើម្បីបំលែងអក្សរទៅសូរដោយប្រើសេវា REST API សូរ៖ ```python def get_speech(text): ``` 1. នៅក្នុងមុខងារ `get_speech` កំណត់ URL ដែលត្រូវហៅ និងក្បាលដាក់ដែលត្រូវផ្ញើ៖ ```python 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 } ``` វាកំណត់ក្បាលដាក់ឲ្យប្រើ access token ដែលបានបង្កើត កំណត់មាតិកា​ជា SSML និងកំណត់ទ្រង់ទ្រាយសម្លេងដែលត្រូវការ។ 1. ចុះក្រោមនេះ កំណត់ SSML សម្រាប់ផ្ញើទៅ REST API៖ ```python ssml = f'' ssml += f'' ssml += text ssml += '' ssml += '' ``` SSML នេះកំណត់ភាសា និងសំឡេងដែលត្រូវប្រើ ជាមួយអត្ថបទដែលត្រូវបំលែង។ 1. ចុងក្រោយ បន្ថែមកូដនៅក្នុងមុខងារនេះដើម្បីធ្វើសំណើ REST និងត្រឡប់ទិន្នន័យអូឌីយោប៊ីណារី៖ ```python response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) return io.BytesIO(response.content) ``` ### កិច្ចការ - លេងសម្លេង 1. ចុះក្រោមមុខងារ `get_speech` សរសេរមុខងារថ្មីមុខងារមួយដើម្បីលេងសម្លេងដែលបានត្រឡប់មកពីការហៅ REST API៖ ```python def play_speech(speech): ``` 1. សម្លេង `speech` ដែលផ្ទាល់ទៅមុខងារនេះគឺជាទិន្នន័យអូឌីយោប៊ីណារីដែលបានត្រឡប់ពី REST API។ ប្រើកូដខាងក្រោមដើម្បីបើកវាជាឯកសារ wave ហើយផ្ញើវាទៅ PyAudio ដើម្បីលេងសម្លេង៖ ```python 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 stream ដូចគ្នានឹងការចាប់យកសម្លេង។ ចំនុចខុសគ្នានៅទីនេះគឺ stream ត្រូវបានកំណត់ជាស្ត្រីមុខចេញ (output stream) ហើយទិន្នន័យត្រូវបានអានពីទិន្នន័យសម្លេង ហើយបញ្ចេញទៅ stream។ មិនដាក់ទិន្នន័យ stream ដូចជាអត្រាគំរូ (sample rate) ជា hard code ទេ តាមម្លេះវាត្រូវបានអានពីទិន្នន័យអូឌីយោ។ 1. ជំនួសខ្លឹមសារទាំងអស់នៃមុខងារ `say` ជា៖ ```python speech = get_speech(text) play_speech(speech) ``` កូដនេះបំលែងអក្សរទៅសូរ ជាទិន្នន័យអូឌីយោប៊ីណារី ហើយលេងសម្លេង។ 1. រត់កម្មវិធី ហើយធ្វើឲ្យកម្មវិធីមុខងារផងដែរ។ កំណត់ម៉ោងឧបករណ៍ និងអ្នកនឹងលឺការឆ្លើយតបដោយផ្សព្វផ្សាយថាម៉ោងបានត្រូវបានកំណត់ហើយ បន្ទាប់មកមានការឆ្លើយតបផ្សព្វផ្សាយម្តងទៀតនៅពេលម៉ោងបានបញ្ចប់។ ប្រសិនបើមានកំហុស `Invalid sample rate` សូមផ្លាស់ប្ដូររូបមន្ត `playback_format` ដូចបានបញ្ជាក់ខាងលើ។ > 💁 អ្នកអាចស្វែងរកកូដនេះនៅក្នុងថត [code-spoken-response/pi](../../../../../6-consumer/lessons/3-spoken-feedback/code-spoken-response/pi)។ 😀 ព្រឹត្តិការណ៍ម៉ោងរបស់អ្នកបានជោគជ័យ! --- **ការបដិសេធ**: ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំរកភាពត្រឹមត្រូវ សូមចាប់អារម្មណ៍ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ អ្នកគួរតែពិចារណាឯកសារដើមដោយភាសាមាតុភូមិសំរាប់ជាឈុតឯកសារដែលមានសុពលភាពជាផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ សូមប្រើការបកប្រែដោយមនុស្សដែលមានជំនាញផ្នែកវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសណាមួយដែលកើតមានដោយសារការប្រើប្រាស់ការបកប្រែនេះឡើយ។