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

12 KiB

ពាក្យអក្សរទៅសូរ - Raspberry Pi

នៅផ្នែកនេះនៃមេរៀន អ្នកនឹងសរសេរកូដដើម្បីបំលែងអក្សរទៅសូរដោយប្រើសេវាកម្មសូរ។

បំលែងអក្សរទៅសូរដោយប្រើសេវាកម្មសូរ

អក្សរអាចត្រូវបានផ្ញើទៅសេវាកម្មសូរដោយប្រើ REST API ដើម្បីទទួលបានសូរជាកំណត់ត្រាអូឌីយោដែលអាចលេងឡើងវិញនៅលើឧបករណ៍ IoT របស់អ្នក។ នៅពេលស្នើសុំសូរ អ្នកត្រូវផ្ដល់សំឡេងដែលត្រូវប្រើ ដោយសូរអាចត្រូវបង្កើតដោយប្រើសំឡេងខុសៗគ្នាច្រើន។

ភាសាគ្រប់ភាសាចូលគាំទ្រសំឡេងច្រើនប្រភេទ ហើយអ្នកអាចធ្វើសំណើ REST ទៅសេវាកម្មសូរដើម្បីទទួលបានបញ្ជីសំឡេងដែលគាំទ្រសម្រាប់ភាសានីមួយៗ។

កិច្ចការនៃការទទួលបានសំឡេង

  1. បើកគម្រោង smart-timer នៅក្នុង VS Code។

  2. បន្ថែមកូដខាងក្រោមនៅលើមុខមុខងារ 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'
    

កិច្ចការ - បំលែងអក្សរទៅសូរ

  1. ចុះក្រោមនេះ សរសេរជាប់មួយថាសថេរសម្រាប់ទ្រង់ទ្រាយសម្លេងដែលត្រូវទទួលពីសេវាសូរ។ នៅពេលអ្នកស្នើសុំអូឌីយោ អ្នកអាចធ្វើបានជាទ្រង់ទ្រាយជាច្រើនផ្សេងៗ។

    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

  2. ចុះក្រោមនេះ សរសេរមុខងារដែលមានឈ្មោះ get_speech ដើម្បីបំលែងអក្សរទៅសូរដោយប្រើសេវា REST API សូរ៖

    def get_speech(text):
    
  3. នៅក្នុងមុខងារ 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 និងកំណត់ទ្រង់ទ្រាយសម្លេងដែលត្រូវការ។

  4. ចុះក្រោមនេះ កំណត់ 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 នេះកំណត់ភាសា និងសំឡេងដែលត្រូវប្រើ ជាមួយអត្ថបទដែលត្រូវបំលែង។

  5. ចុងក្រោយ បន្ថែមកូដនៅក្នុងមុខងារនេះដើម្បីធ្វើសំណើ REST និងត្រឡប់ទិន្នន័យអូឌីយោប៊ីណារី៖

    response = requests.post(url, headers=headers, data=ssml.encode('utf-8'))
    return io.BytesIO(response.content)
    

កិច្ចការ - លេងសម្លេង

  1. ចុះក្រោមមុខងារ get_speech សរសេរមុខងារថ្មីមុខងារមួយដើម្បីលេងសម្លេងដែលបានត្រឡប់មកពីការហៅ REST API៖

    def play_speech(speech):
    
  2. សម្លេង 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 ទេ តាមម្លេះវាត្រូវបានអានពីទិន្នន័យអូឌីយោ។

  3. ជំនួសខ្លឹមសារទាំងអស់នៃមុខងារ say ជា៖

    speech = get_speech(text)
    play_speech(speech)
    

    កូដនេះបំលែងអក្សរទៅសូរ ជាទិន្នន័យអូឌីយោប៊ីណារី ហើយលេងសម្លេង។

  4. រត់កម្មវិធី ហើយធ្វើឲ្យកម្មវិធីមុខងារផងដែរ។ កំណត់ម៉ោងឧបករណ៍ និងអ្នកនឹងលឺការឆ្លើយតបដោយផ្សព្វផ្សាយថាម៉ោងបានត្រូវបានកំណត់ហើយ បន្ទាប់មកមានការឆ្លើយតបផ្សព្វផ្សាយម្តងទៀតនៅពេលម៉ោងបានបញ្ចប់។

    ប្រសិនបើមានកំហុស Invalid sample rate សូមផ្លាស់ប្ដូររូបមន្ត playback_format ដូចបានបញ្ជាក់ខាងលើ។

💁 អ្នកអាចស្វែងរកកូដនេះនៅក្នុងថត code-spoken-response/pi

😀 ព្រឹត្តិការណ៍ម៉ោងរបស់អ្នកបានជោគជ័យ!


ការបដិសេធ:
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI Co-op Translator។ ខណៈពេលដែលយើងខិតខំរកភាពត្រឹមត្រូវ សូមចាប់អារម្មណ៍ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ អ្នកគួរតែពិចារណាឯកសារដើមដោយភាសាមាតុភូមិសំរាប់ជាឈុតឯកសារដែលមានសុពលភាពជាផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ សូមប្រើការបកប្រែដោយមនុស្សដែលមានជំនាញផ្នែកវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសណាមួយដែលកើតមានដោយសារការប្រើប្រាស់ការបកប្រែនេះឡើយ។