12 KiB
แปลข้อความ - Raspberry Pi
ในส่วนนี้ของบทเรียน คุณจะเขียนโค้ดเพื่อแปลข้อความโดยใช้บริการแปลภาษา
แปลงข้อความเป็นเสียงโดยใช้บริการแปลภาษา
REST API ของบริการเสียงไม่รองรับการแปลโดยตรง แต่คุณสามารถใช้บริการ Translator เพื่อแปลข้อความที่สร้างจากบริการแปลงเสียงเป็นข้อความ และข้อความที่ตอบกลับด้วยเสียง บริการนี้มี REST API ที่คุณสามารถใช้เพื่อแปลข้อความได้
งาน - ใช้ทรัพยากร Translator เพื่อแปลข้อความ
-
ตัวจับเวลาสมาร์ทของคุณจะมีการตั้งค่าภาษาสองภาษา - ภาษาของเซิร์ฟเวอร์ที่ใช้ฝึก LUIS (ภาษาเดียวกันนี้ยังใช้สร้างข้อความเพื่อพูดกับผู้ใช้) และภาษาที่ผู้ใช้พูด อัปเดตตัวแปร
language
ให้เป็นภาษาที่ผู้ใช้จะพูด และเพิ่มตัวแปรใหม่ชื่อserver_language
สำหรับภาษาที่ใช้ฝึก LUIS:language = '<user language>' server_language = '<server language>'
แทนที่
<user language>
ด้วยชื่อโลเคลของภาษาที่คุณจะพูด เช่นfr-FR
สำหรับภาษาฝรั่งเศส หรือzn-HK
สำหรับภาษากวางตุ้งแทนที่
<server language>
ด้วยชื่อโลเคลของภาษาที่ใช้ฝึก LUISคุณสามารถค้นหารายชื่อภาษาที่รองรับและชื่อโลเคลได้ใน เอกสารสนับสนุนภาษาและเสียงบน Microsoft docs
💁 หากคุณไม่พูดได้หลายภาษา คุณสามารถใช้บริการอย่าง Bing Translate หรือ Google Translate เพื่อแปลจากภาษาที่คุณถนัดไปยังภาษาที่คุณเลือก บริการเหล่านี้สามารถเล่นเสียงของข้อความที่แปลได้
ตัวอย่างเช่น หากคุณฝึก LUIS ในภาษาอังกฤษ แต่ต้องการใช้ภาษาฝรั่งเศสเป็นภาษาผู้ใช้ คุณสามารถแปลประโยคเช่น "ตั้งเวลาสองนาทีและยี่สิบเจ็ดวินาที" จากภาษาอังกฤษเป็นภาษาฝรั่งเศสโดยใช้ Bing Translate จากนั้นใช้ปุ่ม ฟังการแปล เพื่อพูดการแปลผ่านไมโครโฟนของคุณ
-
เพิ่มคีย์ API ของ Translator ใต้
speech_api_key
:translator_api_key = '<key>'
แทนที่
<key>
ด้วยคีย์ API สำหรับทรัพยากรบริการแปลภาษาของคุณ -
เหนือฟังก์ชัน
say
ให้กำหนดฟังก์ชันtranslate_text
ที่จะใช้แปลข้อความจากภาษาของเซิร์ฟเวอร์ไปยังภาษาของผู้ใช้:def translate_text(text, from_language, to_language):
ภาษาต้นทางและปลายทางจะถูกส่งไปยังฟังก์ชันนี้ - แอปของคุณต้องแปลงจากภาษาผู้ใช้เป็นภาษาของเซิร์ฟเวอร์เมื่อรับรู้เสียง และจากภาษาของเซิร์ฟเวอร์เป็นภาษาผู้ใช้เมื่อให้คำตอบด้วยเสียง
-
ภายในฟังก์ชันนี้ ให้กำหนด URL และ headers สำหรับการเรียก REST API:
url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0' headers = { 'Ocp-Apim-Subscription-Key': translator_api_key, 'Ocp-Apim-Subscription-Region': location, 'Content-type': 'application/json' }
URL สำหรับ API นี้ไม่ขึ้นอยู่กับตำแหน่งที่ตั้ง แต่ตำแหน่งที่ตั้งจะถูกส่งเป็น header คีย์ API ถูกใช้โดยตรง ดังนั้นไม่จำเป็นต้องรับโทเค็นการเข้าถึงจาก API ผู้ออกโทเค็นเหมือนบริการเสียง
-
ใต้ส่วนนี้ กำหนดพารามิเตอร์และ body สำหรับการเรียก:
params = { 'from': from_language, 'to': to_language } body = [{ 'text' : text }]
params
กำหนดพารามิเตอร์ที่จะส่งไปยังการเรียก API โดยส่งภาษาต้นทางและปลายทาง การเรียกนี้จะแปลข้อความในภาษาต้นทางเป็นภาษาปลายทางbody
ประกอบด้วยข้อความที่จะถูกแปล ซึ่งเป็นอาร์เรย์ เนื่องจากสามารถแปลข้อความหลายบล็อกในคำสั่งเดียวกันได้ -
ทำการเรียก REST API และรับการตอบกลับ:
response = requests.post(url, headers=headers, params=params, json=body)
การตอบกลับที่ได้รับกลับมาเป็น JSON array โดยมีหนึ่งรายการที่มีการแปล รายการนี้มีอาร์เรย์สำหรับการแปลของทุกรายการที่ส่งใน body
[ { "translations": [ { "text": "Set a 2 minute 27 second timer.", "to": "en" } ] } ]
-
ส่งคืนคุณสมบัติ
test
จากการแปลแรกในรายการแรกของอาร์เรย์:return response.json()[0]['translations'][0]['text']
-
อัปเดตลูป
while True
เพื่อแปลข้อความจากการเรียกconvert_speech_to_text
จากภาษาผู้ใช้เป็นภาษาของเซิร์ฟเวอร์:if len(text) > 0: print('Original:', text) text = translate_text(text, language, server_language) print('Translated:', text) message = Message(json.dumps({ 'speech': text })) device_client.send_message(message)
โค้ดนี้ยังพิมพ์ข้อความต้นฉบับและข้อความที่แปลลงในคอนโซลด้วย
-
อัปเดตฟังก์ชัน
say
เพื่อแปลข้อความที่จะพูดจากภาษาของเซิร์ฟเวอร์เป็นภาษาผู้ใช้:def say(text): print('Original:', text) text = translate_text(text, server_language, language) print('Translated:', text) speech = get_speech(text) play_speech(speech)
โค้ดนี้ยังพิมพ์ข้อความต้นฉบับและข้อความที่แปลลงในคอนโซลด้วย
-
รันโค้ดของคุณ ตรวจสอบให้แน่ใจว่าแอปฟังก์ชันของคุณกำลังทำงาน และขอตั้งเวลาผ่านภาษาผู้ใช้ ไม่ว่าจะโดยการพูดภาษานั้นเอง หรือใช้แอปแปลภาษา
pi@raspberrypi:~/smart-timer $ python3 app.py Connecting Connected Using voice fr-FR-DeniseNeural Original: Définir une minuterie de 2 minutes et 27 secondes. Translated: Set a timer of 2 minutes and 27 seconds. Original: 2 minute 27 second timer started. Translated: 2 minute 27 seconde minute a commencé. Original: Times up on your 2 minute 27 second timer. Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.
💁 เนื่องจากวิธีการพูดบางอย่างในภาษาต่างๆ อาจแตกต่างกัน คุณอาจได้รับการแปลที่แตกต่างจากตัวอย่างที่คุณให้กับ LUIS หากเป็นกรณีนี้ ให้เพิ่มตัวอย่างเพิ่มเติมใน LUIS ฝึกใหม่ แล้วเผยแพร่โมเดลอีกครั้ง
💁 คุณสามารถค้นหาโค้ดนี้ได้ใน code/pi โฟลเดอร์
😀 โปรแกรมจับเวลาหลายภาษาของคุณประสบความสำเร็จ!
ข้อจำกัดความรับผิดชอบ:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้