12 KiB
ពាក្យអក្សរទៅសូរ - Raspberry Pi
នៅផ្នែកនេះនៃមេរៀន អ្នកនឹងសរសេរកូដដើម្បីបំលែងអក្សរទៅសូរដោយប្រើសេវាកម្មសូរ។
បំលែងអក្សរទៅសូរដោយប្រើសេវាកម្មសូរ
អក្សរអាចត្រូវបានផ្ញើទៅសេវាកម្មសូរដោយប្រើ REST API ដើម្បីទទួលបានសូរជាកំណត់ត្រាអូឌីយោដែលអាចលេងឡើងវិញនៅលើឧបករណ៍ 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ពេលលេងអូឌីយោ សូមផ្លាស់ប្ដូរទៅតម្លៃផ្សេងទៀត។ អ្នកអាចស្វែងរកបញ្ជីតម្លៃគាំទ្រនៅក្នុង ឯកសារ Text to speech 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 }វាកំណត់ក្បាលដាក់ឲ្យប្រើ access token ដែលបានបង្កើត កំណត់មាតិកាជា 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 stream ដូចគ្នានឹងការចាប់យកសម្លេង។ ចំនុចខុសគ្នានៅទីនេះគឺ stream ត្រូវបានកំណត់ជាស្ត្រីមុខចេញ (output stream) ហើយទិន្នន័យត្រូវបានអានពីទិន្នន័យសម្លេង ហើយបញ្ចេញទៅ stream។
មិនដាក់ទិន្នន័យ stream ដូចជាអត្រាគំរូ (sample rate) ជា hard code ទេ តាមម្លេះវាត្រូវបានអានពីទិន្នន័យអូឌីយោ។
-
ជំនួសខ្លឹមសារទាំងអស់នៃមុខងារ
sayជា៖speech = get_speech(text) play_speech(speech)កូដនេះបំលែងអក្សរទៅសូរ ជាទិន្នន័យអូឌីយោប៊ីណារី ហើយលេងសម្លេង។
-
រត់កម្មវិធី ហើយធ្វើឲ្យកម្មវិធីមុខងារផងដែរ។ កំណត់ម៉ោងឧបករណ៍ និងអ្នកនឹងលឺការឆ្លើយតបដោយផ្សព្វផ្សាយថាម៉ោងបានត្រូវបានកំណត់ហើយ បន្ទាប់មកមានការឆ្លើយតបផ្សព្វផ្សាយម្តងទៀតនៅពេលម៉ោងបានបញ្ចប់។
ប្រសិនបើមានកំហុស
Invalid sample rateសូមផ្លាស់ប្ដូររូបមន្តplayback_formatដូចបានបញ្ជាក់ខាងលើ។
💁 អ្នកអាចស្វែងរកកូដនេះនៅក្នុងថត code-spoken-response/pi។
😀 ព្រឹត្តិការណ៍ម៉ោងរបស់អ្នកបានជោគជ័យ!
ការបដិសេធ:
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI Co-op Translator។ ខណៈពេលដែលយើងខិតខំរកភាពត្រឹមត្រូវ សូមចាប់អារម្មណ៍ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ អ្នកគួរតែពិចារណាឯកសារដើមដោយភាសាមាតុភូមិសំរាប់ជាឈុតឯកសារដែលមានសុពលភាពជាផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ សូមប្រើការបកប្រែដោយមនុស្សដែលមានជំនាញផ្នែកវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសណាមួយដែលកើតមានដោយសារការប្រើប្រាស់ការបកប្រែនេះឡើយ។