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/he/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md

156 lines
8.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "606f3af1c78e3741e48ce77c31cea626",
"translation_date": "2025-08-27T22:28:01+00:00",
"source_file": "6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md",
"language_code": "he"
}
-->
# טקסט לדיבור - 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` בעת השמעת השמע, שנו זאת לערך אחר. ניתן למצוא את רשימת הערכים הנתמכים ב-[תיעוד 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
}
```
זה מגדיר את הכותרות לשימוש בטוקן גישה שנוצר, מגדיר את התוכן כ-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, בדומה ללכידת שמע. ההבדל כאן הוא שהזרם מוגדר כזרם פלט, ונתונים נקראים מנתוני השמע ומועברים לזרם.
במקום לקבוע מראש את פרטי הזרם כמו קצב הדגימה, הם נקראים מתוך נתוני השמע.
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](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו אחראים לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.