You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/km/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md

149 lines
12 KiB

# ពាក្យអក្សរទៅសូរ - 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'<speak version=\'1.0\' xml:lang=\'{language}\'>'
ssml += f'<voice xml:lang=\'{language}\' name=\'{voice}\'>'
ssml += text
ssml += '</voice>'
ssml += '</speak>'
```
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)។
😀 ព្រឹត្តិការណ៍ម៉ោងរបស់អ្នកបានជោគជ័យ!
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**ការបដិសេធ**:
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំរកភាពត្រឹមត្រូវ សូមចាប់អារម្មណ៍ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ អ្នកគួរតែពិចារណាឯកសារដើមដោយភាសាមាតុភូមិសំរាប់ជាឈុតឯកសារដែលមានសុពលភាពជាផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ សូមប្រើការបកប្រែដោយមនុស្សដែលមានជំនាញផ្នែកវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសណាមួយដែលកើតមានដោយសារការប្រើប្រាស់ការបកប្រែនេះឡើយ។
<!-- CO-OP TRANSLATOR DISCLAIMER END -->