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.
149 lines
12 KiB
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 --> |