Gemini-TTS הוא הדור הבא של טכנולוגיית Cloud TTS שלנו. הוא לא רק מספק דיבור שנשמע טבעי, אלא גם מאפשר שליטה מדויקת באודיו שנוצר באמצעות הנחיות מבוססות-טקסט. בעזרת Gemini-TTS, אתם יכולים לסנתז דיבור של דובר אחד או כמה דוברים מקטעים קצרים ועד לסיפורים ארוכים, ולשלוט בדיוק בסגנון, במבטא, בקצב, בטון ואפילו בהבעה הרגשית, והכול באמצעות הנחיות בשפה טבעית.
מודלים זמינים
Gemini-TTS כולל את המודלים הזמינים הבאים:
Gemini 2.5 Flash TTS
| מזהה הדגם | gemini-2.5-flash-tts |
|---|---|
| אופטימיזציה ל | יצירת אודיו ב-Cloud TTS עם זמן אחזור נמוך, שליטה, רמקול יחיד ורמקולים מרובים לאפליקציות יומיומיות חסכוניות |
| אמצעי קלט ופלט |
|
| תמיכה במספר הרמקול | רמקול יחיד, רמקולים מרובים |
| פורמטים נתמכים של פלט אודיו |
|
| תמיכה באזור | אזורים זמינים |
| אפשרויות קול | אפשרויות קוליות |
| השפות הזמינות | השפות הזמינות |
| דוגמה |
model: "gemini-2.5-flash-tts"
prompt: "Say the following"
text: "[extremely fast] Availability and terms may vary.
Check our website or your local store for complete
details and restrictions."
speaker: "Kore"
|
Gemini 2.5 Flash Lite TTS (גרסת טרום-השקה)
| מזהה הדגם | gemini-2.5-flash-lite-preview-tts |
|---|---|
| אופטימיזציה ל | יצירת אודיו ב-Cloud TTS עם זמן אחזור נמוך, שאפשר לשלוט בו, עם דובר יחיד, לאפליקציות יומיומיות חסכוניות. שימו לב שהמודל הזה נמצא בגרסת טרום-השקה. |
| אמצעי קלט ופלט |
|
| תמיכה במספר הרמקול | רווק/ה |
| פורמטים נתמכים של פלט אודיו |
|
| תמיכה באזור | אזורים זמינים |
| אפשרויות קול | אפשרויות קוליות |
| השפות הזמינות | השפות הזמינות |
| דוגמה |
model: "gemini-2.5-flash-lite-preview-tts"
prompt: "Say the following in an elated way"
text: "Congratulations on the recent achievements!"
speaker: "Aoede"
|
Gemini 2.5 Pro TTS
| מזהה הדגם | gemini-2.5-pro-tts |
|---|---|
| אופטימיזציה ל | שליטה גבוהה בתהליכי עבודה מובנים כמו יצירת פודקאסטים, ספרי אודיו, תמיכת לקוחות ועוד |
| אמצעי קלט ופלט |
|
| תמיכה במספר הרמקול | רמקול יחיד, רמקולים מרובים |
| פורמטים נתמכים של פלט אודיו |
|
| תמיכה באזור | אזורים זמינים |
| אפשרויות קול | אפשרויות קוליות |
| השפות הזמינות | השפות הזמינות |
| דוגמה |
model: "gemini-2.5-pro-tts"
prompt: "You are having a casual conversation with a friend.
Say the following in a friendly and amused way."
text: "hahah I did NOT expect that. Can you believe it!."
speaker: "Callirrhoe"
|
אמצעי בקרה נוספים
אמצעי בקרה ויכולות נוספים:
שיחה טבעית: אינטראקציות קוליות באיכות גבוהה במיוחד, עם הבעה מתאימה יותר ודפוסי קצב, שמתבצעות עם השהיה נמוכה מאוד כדי שתוכלו לנהל שיחה בצורה שוטפת.
שליטה בסגנון: באמצעות הנחיות בשפה טבעית, אתם יכולים לשנות את אופן ההעברה בשיחה, למשל להנחות את המודל לאמץ מבטאים ספציפיים ולייצר מגוון של טונים וביטויים, כולל לחישה.
ביצועים דינמיים: המודלים האלה יכולים להפיח חיים בטקסט כדי ליצור קריאות אקספרסיביות של שירה, שידורי חדשות וסיפורים מרתקים. הם גם יכולים להציג רגשות ספציפיים ולבטא מבטאים שונים לפי בקשה.
שליטה משופרת בקצב ובדיבור: שליטה במהירות ההשמעה עוזרת להבטיח הגייה מדויקת יותר, כולל מילים ספציפיות.
במאמר בחירת ה-API המתאים מוסבר איך לבחור את ה-API המתאים לשימוש בקולות האלה באפליקציה.
אפשרויות קול
Gemini-TTS מציע מגוון רחב של אפשרויות קוליות, בדומה ל-Chirp 3 הקיים שלנו: קולות באיכות HD, שלכל אחד מהם מאפיינים ייחודיים:
| שם | מגדר | הדגמה |
|---|---|---|
| Achernar | נקבה | |
| Achird | זכר | |
| Algenib | זכר | |
| Algieba | זכר | |
| Alnilam | זכר | |
| Aoede | נקבה | |
| Autonoe | נקבה | |
| Callirrhoe | נקבה | |
| כארון | זכר | |
| Despina | נקבה | |
| אנקלאדוס | זכר | |
| Erinome | נקבה | |
| Fenrir | זכר | |
| Gacrux | נקבה | |
| יאפטוס | זכר | |
| Kore | נקבה | |
| Laomedeia | נקבה | |
| Leda | נקבה | |
| Orus | זכר | |
| Pulcherrima | נקבה | |
| Puck | זכר | |
| Rasalgethi | זכר | |
| Sadachbia | זכר | |
| Sadaltager | זכר | |
| Schedar | זכר | |
| Sulafat | נקבה | |
| Umbriel | זכר | |
| Vindemiatrix | נקבה | |
| Zephyr | נקבה | |
| Zubenelgenubi | זכר |
השפות הזמינות
Gemini-TTS תומך בשפות הבאות:
| שפה | קוד BCP-47 | מוכנות להשקה |
|---|---|---|
| ערבית (מצרים) | ar-EG | GA |
| בנגלית (בנגלדש) | bn-BD | GA |
| הולנדית (הולנד) | nl-NL | GA |
| אנגלית (הודו) | en-IN | GA |
| אנגלית (ארצות הברית) | en-US | GA |
| צרפתית (צרפת) | fr-FR | GA |
| גרמנית (גרמניה) | de-DE | GA |
| הינדית (הודו) | hi-IN | GA |
| אינדונזית (אינדונזיה) | id-ID | GA |
| איטלקית (איטליה) | it-IT | GA |
| יפנית (יפן) | ja-JP | GA |
| קוריאנית (דרום קוריאה) | ko-KR | GA |
| מראטהית (הודו) | mr-IN | GA |
| פולנית (פולין) | pl-PL | GA |
| פורטוגזית (ברזיל) | pt-BR | GA |
| רומנית (רומניה) | ro-RO | GA |
| רוסית (רוסיה) | ru-RU | GA |
| ספרדית (ספרד) | es-ES | GA |
| טמילית (הודו) | ta-IN | GA |
| טלוגו (הודו) | te-IN | GA |
| תאית (תאילנד) | th-TH | GA |
| טורקית (טורקיה) | tr-TR | GA |
| אוקראינית (אוקראינה) | uk-UA | GA |
| וייטנאמית (וייטנאם) | vi-VN | GA |
| אפריקאנס (דרום אפריקה) | af-ZA | תצוגה מקדימה |
| אלבנית (אלבניה) | sq-AL | תצוגה מקדימה |
| אמהרית (אתיופיה) | am-ET | תצוגה מקדימה |
| ערבית (עולמית) | ar-001 | תצוגה מקדימה |
| ארמנית (ארמניה) | hy-AM | תצוגה מקדימה |
| אזרית (אזרבייג'ן) | az-AZ | תצוגה מקדימה |
| בסקית (ספרד) | eu-ES | תצוגה מקדימה |
| בלארוסית (בלארוס) | be-BY | תצוגה מקדימה |
| בולגרית (בולגריה) | bg-BG | תצוגה מקדימה |
| בורמזית (מיאנמר) | my-MM | תצוגה מקדימה |
| קטלאנית (ספרד) | ca-ES | תצוגה מקדימה |
| סבואנו (הפיליפינים) | ceb-PH | תצוגה מקדימה |
| סינית, מנדרינית (סין) | cmn-CN | תצוגה מקדימה |
| סינית, מנדרינית (טייוואן) | cmn-tw | תצוגה מקדימה |
| קרואטית (קרואטיה) | hr-HR | תצוגה מקדימה |
| צ'כית (צ'כיה) | cs-CZ | תצוגה מקדימה |
| דנית (דנמרק) | da-DK | תצוגה מקדימה |
| אנגלית (אוסטרליה) | en-AU | תצוגה מקדימה |
| אנגלית (בריטניה) | en-GB | תצוגה מקדימה |
| אסטונית (אסטוניה) | et-EE | תצוגה מקדימה |
| פיליפינית (פיליפינים) | fil-PH | תצוגה מקדימה |
| פינית (פינלנד) | fi-FI | תצוגה מקדימה |
| צרפתית (קנדה) | fr-CA | תצוגה מקדימה |
| גליציאנית (ספרד) | gl-ES | תצוגה מקדימה |
| גאורגית (גאורגיה) | ka-GE | תצוגה מקדימה |
| יוונית (יוון) | el-GR | תצוגה מקדימה |
| גוג'ראטית (הודו) | gu-IN | תצוגה מקדימה |
| קריאולית של האיטי (האיטי) | ht-HT | תצוגה מקדימה |
| עברית (ישראל) | he-IL | תצוגה מקדימה |
| הונגרית (הונגריה) | hu-HU | תצוגה מקדימה |
| איסלנדית (איסלנד) | is-IS | תצוגה מקדימה |
| ג'אווה (Java) | jv-JV | תצוגה מקדימה |
| קאנדה (הודו) | kn-IN | תצוגה מקדימה |
| קונקאני (הודו) | kok-IN | תצוגה מקדימה |
| לאו (לאוס) | lo-LA | תצוגה מקדימה |
| לטינית (קריית הוותיקן) | la-VA | תצוגה מקדימה |
| לטבית (לטביה) | lv-LV | תצוגה מקדימה |
| ליטאית (ליטא) | lt-LT | תצוגה מקדימה |
| לוקסמבורגית (לוקסמבורג) | lb-LU | תצוגה מקדימה |
| מקדונית (מקדוניה הצפונית) | mk-MK | תצוגה מקדימה |
| מאיתילי (הודו) | mai-IN | תצוגה מקדימה |
| מלגשית (מדגסקר) | mg-MG | תצוגה מקדימה |
| מלאית (מלזיה) | ms-MY | תצוגה מקדימה |
| מליאלאם (הודו) | ml-IN | תצוגה מקדימה |
| מונגולית (מונגוליה) | mn-MN | תצוגה מקדימה |
| נפאלית (נפאל) | ne-NP | תצוגה מקדימה |
| נורווגית, ספרותית (נורווגיה) | nb-NO | תצוגה מקדימה |
| נורווגית, נינורסק (נורווגיה) | nn-NO | תצוגה מקדימה |
| אודיה (הודו) | or-IN | תצוגה מקדימה |
| פאשטו (אפגניסטן) | ps-AF | תצוגה מקדימה |
| פרסית (איראן) | fa-IR | תצוגה מקדימה |
| פורטוגזית (פורטוגל) | pt-PT | תצוגה מקדימה |
| פנג'אבי (הודו) | pa-IN | תצוגה מקדימה |
| סרבית (סרביה) | sr-RS | תצוגה מקדימה |
| סינדהי (הודו) | sd-IN | תצוגה מקדימה |
| סינהלית (סרי לנקה) | si-LK | תצוגה מקדימה |
| סלובקית (סלובקיה) | sk-SK | תצוגה מקדימה |
| סלובנית (סלובניה) | sl-SI | תצוגה מקדימה |
| ספרדית (אמריקה הלטינית) | es-419 | תצוגה מקדימה |
| ספרדית (מקסיקו) | es-MX | תצוגה מקדימה |
| סוואהילי (קניה) | sw-KE | תצוגה מקדימה |
| שוודית (שוודיה) | sv-SE | תצוגה מקדימה |
| אורדו (פקיסטן) | ur-PK | תצוגה מקדימה |
אזורים שבהם השירות זמין
Gemini-TTS זמין בכמה אזורים, דרך Cloud Text-to-Speech API או Vertex AI API.
עיבוד ה-ML של המודלים האלה מתבצע באזור הספציפי או במספר אזורים שבהם מתבצעת הבקשה. מידע נוסף מופיע במאמר בנושא מיקום הנתונים.
האזורים הבאים נתמכים ב-Cloud Text-to-Speech API:
| אזור | מדינה או אזור שיפוט | מודלים זמינים |
|---|---|---|
global |
כל העולם (חוץ מאזורי DRZ) | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
us |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
eu |
האיחוד האירופי | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
northamerica-northeast1 |
קנדה | gemini-2.5-flash-ttsgemini-2.5-flash-lite-preview-tts |
אפשר לגשת לאזורים האלה באמצעות נקודות הקצה הבאות של API:
<REGION>-texttospeech.googleapis.com. שימו לב: לאזור global אין קידומת: texttospeech.googleapis.com.
האזורים הבאים נתמכים ב-Vertex AI API:
| אזור | מדינה או אזור שיפוט | מודלים זמינים |
|---|---|---|
global |
כל העולם (חוץ מאזורי DRZ) | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
europe-central2 |
האיחוד האירופי | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
europe-north1 |
האיחוד האירופי | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
europe-southwest1 |
האיחוד האירופי | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
europe-west1 |
האיחוד האירופי | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
europe-west4 |
האיחוד האירופי | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
northamerica-northeast1 |
קנדה | gemini-2.5-flash-ttsgemini-2.5-flash-lite-preview-tts |
us-central1 |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
us-east1 |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
us-east4 |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
us-east5 |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
us-south1 |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
us-west1 |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
us-west4 |
ארצות הברית | gemini-2.5-flash-ttsgemini-2.5-pro-ttsgemini-2.5-flash-lite-preview-tts |
אפשר לגשת לאזורים האלה באמצעות נקודות הקצה הבאות של API:
<REGION>-aiplatform.googleapis.com. שימו לב: לאזור global אין קידומת: aiplatform.googleapis.com.
בחירת ה-API הנכון
במאמר הזה מוסבר איך להשתמש במודלים של Gemini-TTS כדי לבצע סינתזה של דיבור של דובר אחד ושל כמה דוברים באמצעות Cloud Text-to-Speech API או Vertex AI API.
Gemini-TTS זמין דרך שני ממשקי API כדי לפשט את תהליך השילוב עבור לקוחות. Cloud Text-to-Speech API ו-Vertex AI API, עם נקודות קצה של REST וערכות SDK בשפות תכנות שונות.
ריכזנו כאן כמה הנחיות שיעזרו לכם לבחור את ה-API המתאים.
אם התנאים הבאים מתקיימים, בוחרים באפשרות Cloud Text-to-Speech API:
- אם אתם משתמשים ב-Chirp 3 HD או בקולות אחרים, אתם יכולים להמשיך להשתמש באותו Cloud Text-to-Speech API עם עדכונים מצטברים מינימליים.
- אם אתם צריכים סוגים ספציפיים של קידוד פלט, אתם יכולים לציין קידוד אודיו ב-Cloud Text-to-Speech API. ב-Vertex AI API, הפלט הוא נתוני אודיו PCM 16bit 24k, והוא לא כולל כותרות WAV. אם רוצים להמיר לפורמט אודיו אחר, ההמרה צריכה להתבצע בצד הלקוח.
- אם אתם חייבים להזרים טקסט בכמה מקטעים, Cloud Text-to-Speech API תומך באינטראקציה של כמה בקשות וכמה תגובות. לעומת זאת, Vertex AI API תומך בבקשה אחת ובתשובות מרובות.
אם אחד מהמקרים הבאים רלוונטי, בוחרים באפשרות Vertex AI API:
- אם אתם כבר משתמשים ב-Gemini-TTS מ-AI Studio, אתם יכולים לעבור ל-Vertex AI בצורה חלקה כדי ליהנות מהיתרונות של Google Cloudמבחינת יכולת הרחבה ותאימות.
- אם אתם משתמשים ב-Vertex AI API למודלים אחרים, מבנה ה-API המאוחד מקל על תחילת השימוש ב-Gemini-TTS. כדי לעשות זאת, צריך לציין את שם המודל ואת אפשרויות בחירת הקול.
- אם רוצים להגדיר את
temperatureלסינתזה. הפרמטר הזה קובע את מידת הרנדומיזציה של הפלט. רמת אקראיות גבוהה יותר מובילה לתשובות יצירתיות ומגוונות יותר, בעוד שרמת אקראיות נמוכה יותר מובילה לתשובות צפויות וממוקדות יותר. הטווח התקין הוא (0.0, 2.0].
שימוש ב-Cloud Text-to-Speech API
אם אתם צריכים אפשרויות שאינן ברירת המחדל, אתם יכולים לציין פורמטים של אודיו וקצב דגימה בשדה audioConfig.
| תיאור | הגבלה | סוג |
|---|---|---|
| שדה לטקסט | קטן מ-4,000 בייט או שווה לו. | קלט |
| שדה ההנחיה | קטן מ-4,000 בייט או שווה לו. | קלט |
| שדות טקסט ושדות הנחיות | קטן מ-8,000 בייט או שווה לו. | קלט |
| משך הזמן של פלט האודיו | בערך 655 שניות. אם טקסט הקלט גורם לכך שהאודיו חורג מ-655 שניות, האודיו נחתך. | תשובה |
לפני שמתחילים
כדי להתחיל להשתמש ב-Cloud Text-to-Speech, צריך להפעיל את ה-API במסוףGoogle Cloud באמצעות השלבים הבאים:
- מפעילים את Cloud Text-to-Speech בפרויקט.
- מוודאים שהחיוב מופעל עבור Cloud Text-to-Speech.
- מגדירים אימות לסביבת הפיתוח.
- מקצים את ההרשאה
aiplatform.endpoints.predictלמשתמש המאומת. אפשר להעניק את ההרשאה הזו באמצעות התפקיד roles/aiplatform.user. - בוחרים את נקודת הקצה הנכונה ל-API על סמך האזורים הזמינים.
הגדרה של Google Cloud הפרויקט
-
אפשר לבחור פרויקט קיים או ליצור פרויקט חדש. מידע נוסף על יצירת פרויקט זמין במסמכי התיעוד שלGoogle Cloud .
אם יוצרים פרויקט חדש, מופיעה הודעה שבה מתבקשים לקשר חשבון לחיוב. אם אתם משתמשים בפרויקט קיים, הקפידו להפעיל את החיוב
אחרי שבוחרים פרויקט ומקשרים אותו לחשבון לחיוב, אפשר להפעיל את Cloud Text-to-Speech API. עוברים לסרגל חיפוש מוצרים ומשאבים בחלק העליון של הדף ומקלידים speech. בוחרים באפשרות Cloud Text-to-Speech API מתוך רשימת התוצאות.
כדי לנסות את Cloud Text-to-Speech בלי לקשר אותו לפרויקט, בוחרים באפשרות Try this API (ניסיון השימוש ב-API הזה). כדי להפעיל את Cloud Text-to-Speech API לשימוש בפרויקט, לוחצים על Enable (הפעלה).
מגדירים אימות לסביבת הפיתוח. הוראות מפורטות זמינות במאמר בנושא הגדרת אימות ל-Cloud Text-to-Speech.
הגדרת נקודת קצה ל-API באזור מועדף
אפשר לבחור נקודת קצה על סמך אזורים זמינים.
Python
import os
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
TTS_LOCATION = os.getenv("GOOGLE_CLOUD_REGION")
API_ENDPOINT = (
f"{TTS_LOCATION}-texttospeech.googleapis.com"
if TTS_LOCATION != "global"
else "texttospeech.googleapis.com"
)
client = texttospeech.TextToSpeechClient(
client_options=ClientOptions(api_endpoint=API_ENDPOINT)
)
CURL
GLOBAL_API_ENDPOINT=https://texttospeech.googleapis.com
REGIONAL_API_ENDPOINT=https://YOUR_REGION-texttospeech.googleapis.com
ביצוע סינתזה סינכרונית של דובר יחיד
Python
# google-cloud-texttospeech minimum version 2.29.0 is required.
import os
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize(prompt: str, text: str, output_filepath: str = "output.mp3"):
"""Synthesizes speech from the input text and saves it to an MP3 file.
Args:
prompt: Styling instructions on how to synthesize the content in
the text field.
text: The text to synthesize.
output_filepath: The path to save the generated audio file.
Defaults to "output.mp3".
"""
client = texttospeech.TextToSpeechClient()
synthesis_input = texttospeech.SynthesisInput(text=text, prompt=prompt)
# Select the voice you want to use.
voice = texttospeech.VoiceSelectionParams(
language_code="en-US",
name="Charon", # Example voice, adjust as needed
model_name="gemini-2.5-pro-tts"
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.MP3
)
# Perform the text-to-speech request on the text input with the selected
# voice parameters and audio file type.
response = client.synthesize_speech(
input=synthesis_input, voice=voice, audio_config=audio_config
)
# The response's audio_content is binary.
with open(output_filepath, "wb") as out:
out.write(response.audio_content)
print(f"Audio content written to file: {output_filepath}")
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following in a curious way",
"text": "OK, so... tell me about this [uhm] AI thing."
},
"voice": {
"languageCode": "en-us",
"name": "Kore",
"model_name": "gemini-2.5-flash-tts"
},
"audioConfig": {
"audioEncoding": "LINEAR16"
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit
ביצוע סינתזה של רמקול יחיד בסטרימינג
סינתזה של סטרימינג מתאימה לאפליקציות בזמן אמת שבהן תגובה מהירה היא קריטית לחוויית המשתמש. בחיבור סטרימינג, ה-API מחזיר אודיו כשהוא זמין בחלקים קטנים.
בתור מי שקורא ל-API, חשוב לוודא שאתם משתמשים בחלקים של האודיו ומעבירים אותם ללקוחות שלכם כשהם מגיעים (לדוגמה, באמצעות socketio לאפליקציות אינטרנט).
Cloud Text-to-Speech API תומך בהזרמת נתונים מסוג multiple request multiple response. אפשר לשלוח את חלקי הקלט ל-API באופן אסינכרוני כמו שמוצג ב-request_generator, אבל ה-API מתחיל את הסינתזה רק כשהלקוח שולח את Half-Close כאות לכך שהוא לא ישלח יותר נתונים ל-API.
השדה prompt חייב להיות מוגדר בחלק הראשון של הקלט, כי המערכת מתעלמת ממנו בחלקים הבאים.
Python
# google-cloud-texttospeech minimum version 2.29.0 is required.
import datetime
import os
import numpy as np
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize(prompt: str, text_chunks: list[str], model: str, voice: str, locale: str):
"""Synthesizes speech from the input text.
Args:
prompt: Styling instructions on how to synthesize the content in
the text field.
text_chunks: Text chunks to synthesize. Note that The synthesis will
start when the client initiates half-close.
model: gemini tts model name. gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts
voice: voice name. Example: leda, kore. Refer to available voices
locale: locale name. Example: en-us. Refer to available locales.
"""
client = texttospeech.TextToSpeechClient()
config_request = texttospeech.StreamingSynthesizeRequest(
streaming_config=texttospeech.StreamingSynthesizeConfig(
voice=texttospeech.VoiceSelectionParams(
name=voice,
language_code=locale,
model_name=model
)
)
)
# Example request generator. A function like this can be linked to an LLM
# text generator and the text can be passed to the TTS API asynchronously.
def request_generator():
yield config_request
for i, text in enumerate(text_chunks):
yield texttospeech.StreamingSynthesizeRequest(
input=texttospeech.StreamingSynthesisInput(
text=text,
# Prompt is only supported in the first input chunk.
prompt=prompt if i == 0 else None,
)
)
request_start_time = datetime.datetime.now()
streaming_responses = client.streaming_synthesize(request_generator())
is_first_chunk_received = False
final_audio_data = np.array([])
num_chunks_received = 0
for response in streaming_responses:
# just a simple progress indicator
num_chunks_received += 1
print(".", end="")
if num_chunks_received % 40 == 0:
print("")
# measuring time to first audio
if not is_first_chunk_received:
is_first_chunk_received = True
first_chunk_received_time = datetime.datetime.now()
# accumulating audio. In a web-server scenario, you would want to
# "emit" audio to the frontend as soon as it arrives.
#
# For example using flask socketio, you could do the following
# from flask_socketio import SocketIO, emit
# emit("audio", response.audio_content)
# socketio.sleep(0)
audio_data = np.frombuffer(response.audio_content, dtype=np.int16)
final_audio_data = np.concatenate((final_audio_data, audio_data))
time_to_first_audio = first_chunk_received_time - request_start_time
time_to_completion = datetime.datetime.now() - request_start_time
audio_duration = len(final_audio_data) / 24_000 # default sampling rate.
print("\n")
print(f"Time to first audio: {time_to_first_audio.total_seconds()} seconds")
print(f"Time to completion: {time_to_completion.total_seconds()} seconds")
print(f"Audio duration: {audio_duration} seconds")
return final_audio_data
ביצוע סינתזה סינכרונית של כמה דוברים עם קלט טקסט חופשי
| תיאור | מגבלות | סוג |
|---|---|---|
| שדה לטקסט | פחות מ-4,000 בייט או שווה ל-4,000 בייט | קלט |
| שדה ההנחיה | פחות מ-4,000 בייט או שווה ל-4,000 בייט | קלט |
| שדות טקסט ושדות הנחיות | פחות מ-8,000 בייט או שווה ל-8,000 בייט | קלט |
| כינויים של רמקולים | תווים אלפאנומריים ללא רווחים | קלט |
| משך הזמן של פלט האודיו | בערך 655 שניות. אם טקסט הקלט גורם לכך שהאודיו חורג מ-655 שניות, האודיו נחתך. | תשובה |
Python
# google-cloud-texttospeech minimum version 2.31.0 is required.
import os
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize_multispeaker_freeform(
prompt: str,
text: str,
output_filepath: str = "output_non_turn_based.wav",
):
"""Synthesizes speech from non-turn-based input and saves it to a WAV file.
Args:
prompt: Styling instructions on how to synthesize the content in the
text field.
text: The text to synthesize, containing speaker aliases to indicate
different speakers. Example: "Sam: Hi Bob!\nBob: Hi Sam!"
output_filepath: The path to save the generated audio file. Defaults to
"output_non_turn_based.wav".
"""
client = texttospeech.TextToSpeechClient()
synthesis_input = texttospeech.SynthesisInput(text=text, prompt=prompt)
multi_speaker_voice_config = texttospeech.MultiSpeakerVoiceConfig(
speaker_voice_configs=[
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker1",
speaker_id="Kore",
),
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker2",
speaker_id="Charon",
),
]
)
voice = texttospeech.VoiceSelectionParams(
language_code="en-US",
model_name="gemini-2.5-pro-tts",
multi_speaker_voice_config=multi_speaker_voice_config,
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.LINEAR16,
sample_rate_hertz=24000,
)
response = client.synthesize_speech(
input=synthesis_input, voice=voice, audio_config=audio_config
)
with open(output_filepath, "wb") as out:
out.write(response.audio_content)
print(f"Audio content written to file: {output_filepath}")
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts and gemini-2.5-pro-tts
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
# google-cloud-texttospeech minimum version 2.31.0 is required.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following as a conversation between friends.",
"text": "Sam: Hi Bob, how are you?\\nBob: I am doing well, and you?"
},
"voice": {
"languageCode": "en-us",
"modelName": "gemini-2.5-flash-tts",
"multiSpeakerVoiceConfig": {
"speakerVoiceConfigs": [
{
"speakerAlias": "Sam",
"speakerId": "Kore"
},
{
"speakerAlias": "Bob",
"speakerId": "Charon"
}
]
}
},
"audioConfig": {
"audioEncoding": "LINEAR16",
"sampleRateHertz": 24000
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit
ביצוע סינתזה סינכרונית של כמה דוברים עם קלט טקסט מובנה
התכונה 'ריבוי דוברים עם קלט טקסט מובנה' מאפשרת הפיכת טקסט לדיבור בצורה חכמה ודומה לדיבור אנושי. לדוגמה, סוג הקלט הזה שימושי לכתובות ולתאריכים. הזנת טקסט חופשי מקריאה את הטקסט בדיוק כמו שהוא כתוב.
כל שדה של הנחיה ודיאלוג יכול להיות עד 4,000 בייט.| תיאור | מגבלות | סוג |
|---|---|---|
| שדה MultiSpeakerMarkUp | פחות מ-4,000 בייט או שווה ל-4,000 בייט | קלט |
| שדה ההנחיה | פחות מ-4,000 בייט או שווה ל-4,000 בייט | קלט |
| שדות של תגי עיצוב לדוברים שונים והנחיות | פחות מ-8,000 בייט או שווה ל-8,000 בייט | קלט |
| כינויים של רמקולים | תווים אלפאנומריים ללא רווחים | קלט |
| משך הזמן של פלט האודיו | בערך 655 שניות. אם טקסט הקלט גורם לכך שהאודיו חורג מ-655 שניות, האודיו נחתך. | תשובה |
Python
# google-cloud-texttospeech minimum version 2.31.0 is required.
import os
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize_multispeaker_structured(
prompt: str,
turns: list[texttospeech.MultiSpeakerMarkup.Turn],
output_filepath: str = "output_turn_based.wav",
):
"""Synthesizes speech from turn-based input and saves it to a WAV file.
Args:
prompt: Styling instructions on how to synthesize the content in the
text field.
turns: A list of texttospeech.MultiSpeakerMarkup.Turn objects representing
the dialogue turns.
output_filepath: The path to save the generated audio file. Defaults to
"output_turn_based.wav".
"""
client = texttospeech.TextToSpeechClient()
synthesis_input = texttospeech.SynthesisInput(
multi_speaker_markup=texttospeech.MultiSpeakerMarkup(turns=turns),
prompt=prompt,
)
multi_speaker_voice_config = texttospeech.MultiSpeakerVoiceConfig(
speaker_voice_configs=[
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker1",
speaker_id="Kore",
),
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker2",
speaker_id="Charon",
),
]
)
voice = texttospeech.VoiceSelectionParams(
language_code="en-US",
model_name="gemini-2.5-pro-tts",
multi_speaker_voice_config=multi_speaker_voice_config,
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.LINEAR16,
sample_rate_hertz=24000,
)
response = client.synthesize_speech(
input=synthesis_input, voice=voice, audio_config=audio_config
)
with open(output_filepath, "wb") as out:
out.write(response.audio_content)
print(f"Audio content written to file: {output_filepath}")
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
# google-cloud-texttospeech minimum version 2.31.0 is required.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following as a conversation between friends.",
"multiSpeakerMarkup": {
"turns": [
{
"speaker": "Sam",
"text": "Hi Bob, how are you?"
},
{
"speaker": "Bob",
"text": "I am doing well, and you?"
}
]
}
},
"voice": {
"languageCode": "en-us",
"modelName": "gemini-2.5-flash-tts",
"multiSpeakerVoiceConfig": {
"speakerVoiceConfigs": [
{
"speakerAlias": "Sam",
"speakerId": "Kore"
},
{
"speakerAlias": "Bob",
"speakerId": "Charon"
}
]
}
},
"audioConfig": {
"audioEncoding": "LINEAR16",
"sampleRateHertz": 24000
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit
שימוש ב-Vertex AI API
במאמר הזה נסביר איך להשתמש במודלים של Gemini-TTS כדי לסנתז דיבור של דובר אחד ושל כמה דוברים באמצעות Vertex AI API.
ב-Cloud Text-to-Speech API, המשתמש יכול לספק שדות טקסט והנחיות בנפרד. ב-Vertex AI API, זהו שדה contents יחיד, שבו מצוין הקלט בפורמט '{prompt}: {text}', למשל: "Say the following in a curious way: OK, so... tell me about this AI thing."
| תיאור | הגבלה | סוג |
|---|---|---|
| שדה התוכן | קטן מ-8,000 בייט או שווה לו. | קלט |
| משך הזמן של פלט האודיו | בערך 655 שניות. אם טקסט הקלט גורם לכך שהאודיו חורג מ-655 שניות, האודיו נחתך. | תשובה |
לפני שמתחילים
לפני שמתחילים, צריך לפעול לפי שלבי ההתקנה של Vertex AI API. כדי לנצל את האפשרויות של מיקום הנתונים, חשוב להגדיר את LOCATION על סמך האזורים הזמינים.
ביצוע סינתזה סינכרונית של דובר יחיד
בדוגמאות הקוד האלה אפשר לראות איך לבצע סינתזה סינכרונית של דובר יחיד.
Python
from google import genai
from google.genai import types
import wave
import os
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
LOCATION = os.environ.get("GOOGLE_CLOUD_REGION", "global")
# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
with wave.open(filename, "wb") as wf:
wf.setnchannels(channels)
wf.setsampwidth(sample_width)
wf.setframerate(rate)
wf.writeframes(pcm)
client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)
response = client.models.generate_content(
model="gemini-2.5-flash-tts",
contents="Say the following in a curious way: OK, so... tell me about this [uhm] AI thing.",
config=types.GenerateContentConfig(
speech_config=types.SpeechConfig(
language_code="en-in",
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(
voice_name='Kore',
)
)
),
temperature=2.0,
)
)
data = response.candidates[0].content.parts[0].inline_data.data
file_name='output_speech.wav'
wave_file(file_name, data) # Saves the file to current directory
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"contents": {
"role": "user",
"parts": { "text": "Say the following in a curious way: OK, so... tell me about this [uhm] AI thing." }
},
"generation_config": {
"speech_config": {
"language_code": "en-in",
"voice_config": {
"prebuilt_voice_config": {
"voice_name": "kore"
}
}
},
"temperature": 2.0,
}
}' \
https://aiplatform.googleapis.com/v1beta1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash-tts:generateContent \
| jq -r '.candidates[0].content.parts[0].inlineData.data' \
| base64 -d | ffmpeg -f s16le -ar 24k -ac 1 -i - output_speech.wav
ביצוע סינתזה של רמקול יחיד בסטרימינג
ב-Vertex AI API יש תמיכה בסטרימינג חד-כיווני, כלומר הלקוח שולח בקשה אחת ומקבל זרם של תשובות.
דוגמת הקוד הזו ממחישה איך לבצע סינתזה של דיבור של דובר יחיד בסטרימינג.
Python
from google import genai
from google.genai import types
import wave
import os
import datetime
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
LOCATION = os.environ.get("GOOGLE_CLOUD_REGION", "global")
# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
with wave.open(filename, "wb") as wf:
wf.setnchannels(channels)
wf.setsampwidth(sample_width)
wf.setframerate(rate)
wf.writeframes(pcm)
def synthesize(text: str, model: str, voice: str, locale: str):
"""Synthesizes speech from the input text.
Args:
text: Text to synthesize.
model: gemini tts model name. gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts
voice: voice name. Example: leda, kore. Refer to available voices
locale: locale name. Example: en-us. Refer to available locales.
"""
client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)
generate_content_config=types.GenerateContentConfig(
speech_config=types.SpeechConfig(
language_code=locale,
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(
voice_name=voice,
)
)
),
temperature=2.0,
)
request_start_time = datetime.datetime.now()
is_first_chunk_received = False
final_audio_data = bytes()
num_chunks_received = 0
for chunk in client.models.generate_content_stream(
model=model,
contents=text,
config=generate_content_config,
):
# just a simple progress indicator
num_chunks_received += 1
print(".", end="")
if num_chunks_received % 40 == 0:
print("")
# measuring time to first audio
if not is_first_chunk_received:
is_first_chunk_received = True
first_chunk_received_time = datetime.datetime.now()
if (
chunk.candidates is None
or not chunk.candidates
or chunk.candidates[0].content is None
or not chunk.candidates[0].content.parts
):
continue
part = chunk.candidates[0].content.parts[0]
if part.inline_data and part.inline_data.data:
# accumulating audio. In a web-server scenario, you would want to
# "emit" audio to the frontend as soon as it arrives.
#
# For example using flask socketio, you could do the following
# from flask_socketio import SocketIO, emit
# emit("audio", chunk.candidates[0].content.parts[0].inline_data.data)
# socketio.sleep(0)
final_audio_data += chunk.candidates[0].content.parts[0].inline_data.data
time_to_first_audio = first_chunk_received_time - request_start_time
time_to_completion = datetime.datetime.now() - request_start_time
print("\n")
print(f"Time to first audio: {time_to_first_audio.total_seconds()} seconds")
print(f"Time to completion: {time_to_completion.total_seconds()} seconds")
return final_audio_data
audio_data = synthesize(
"Say the following in a curious way: Radio Bakery is a New York City gem, celebrated for its exceptional and creative baked goods. The pistachio croissant is often described as a delight with perfect sweetness. The rhubarb custard croissant is a lauded masterpiece of flaky pastry and tart filling. The brown butter corn cake stands out with its crisp edges and rich flavor. Despite the bustle, the staff consistently receives praise for being friendly and helpful.",
"gemini-2.5-flash-tts",
"Kore",
"en-in")
file_name='output_speech.wav'
wave_file(file_name, audio_data)
Audio("output_speech.wav")
ביצוע סינתזה סינכרונית של כמה דוברים
בדוגמת הקוד הזו אפשר לראות איך לבצע סינתזה סינכרונית של כמה דוברים.
Python
from google import genai
from google.genai import types
import wave
import os
import datetime
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
LOCATION = os.environ.get("GOOGLE_CLOUD_REGION", "global")
prompt = """TTS the following conversation between Joe and Jane:
Joe: How's it going today Jane?
Jane: Not too bad, how about you?"""
# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
with wave.open(filename, "wb") as wf:
wf.setnchannels(channels)
wf.setsampwidth(sample_width)
wf.setframerate(rate)
wf.writeframes(pcm)
client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)
response = client.models.generate_content(
model="gemini-2.5-flash-preview-tts",
contents=prompt,
config=types.GenerateContentConfig(
speech_config=types.SpeechConfig(
language_code="en-in",
multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
speaker_voice_configs=[
types.SpeakerVoiceConfig(
speaker='Joe',
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(
voice_name='Kore',
)
)
),
types.SpeakerVoiceConfig(
speaker='Jane',
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(
voice_name='Puck',
)
)
),
]
)
),
temperature=2.0,
)
)
data = response.candidates[0].content.parts[0].inline_data.data
file_name='output_speech.wav'
wave_file(file_name, data) # Saves the file to current directory
Audio("output_speech.wav")
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"contents": {
"role": "user",
"parts": { "text": "Say the following as a conversation between friends: Sam: Hi Bob, how are you?\\nBob: I am doing well, and you?" }
},
"generation_config": {
"speech_config": {
"language_code": "en-in",
"multi_speaker_voice_config": {
"speaker_voice_configs": [{
"speaker": "Sam",
"voice_config": {
"prebuilt_voice_config": {
"voice_name": "Aoede"
}
}
},{
"speaker": "Bob",
"voice_config": {
"prebuilt_voice_config": {
"voice_name": "Algieba"
}
}
}]
}
},
"temperature": 2.0,
}
}' \
https://aiplatform.googleapis.com/v1beta1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash-tts:generateContent \
| jq -r '.candidates[0].content.parts[0].inlineData.data' \
| base64 -d | ffmpeg -f s16le -ar 24k -ac 1 -i - output_speech.wav
ביצוע סינתזה של כמה רמקולים בסטרימינג
ב-Vertex AI API יש תמיכה בסטרימינג חד-כיווני, כלומר הלקוח שולח בקשה אחת ומקבל זרם של תשובות.
בדוגמת הקוד הזו מוצג איך לבצע סינתזה של כמה דוברים בסטרימינג.
Python
from google import genai
from google.genai import types
import wave
import os
import datetime
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
LOCATION = os.environ.get("GOOGLE_CLOUD_REGION", "global")
prompt = """TTS the following conversation between Joe and Jane:
Joe: How's it going today Jane?
Jane: Not too bad! Honestly, I'm just blown away by this new Gemini Text-to-Speech model.
Joe: Right?! This is a total game changer! And do you know what I just discovered?
Jane: What?
Joe: You can use the multi-speaker configuration to create a conversation, just like us!
Jane: Just like us!"""
# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
with wave.open(filename, "wb") as wf:
wf.setnchannels(channels)
wf.setsampwidth(sample_width)
wf.setframerate(rate)
wf.writeframes(pcm)
def synthesize(text: str, model: str, voice: str, locale: str):
"""Synthesizes speech from the input text.
Args:
text: Text to synthesize. Note that The synthesis will start when the
client initiates half-close.
model: gemini tts model name. gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts
voice: voice name. Example: leda, kore. Refer to available voices
locale: locale name. Example: en-us. Refer to available locales.
"""
client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)
generate_content_config=types.GenerateContentConfig(
speech_config=types.SpeechConfig(
language_code="en-in",
multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
speaker_voice_configs=[
types.SpeakerVoiceConfig(
speaker='Joe',
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(
voice_name='Kore',
)
)
),
types.SpeakerVoiceConfig(
speaker='Jane',
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(
voice_name='Puck',
)
)
),
]
)
),
temperature=2.0,
)
request_start_time = datetime.datetime.now()
is_first_chunk_received = False
final_audio_data = bytes()
num_chunks_received = 0
for chunk in client.models.generate_content_stream(
model=model,
contents=text,
config=generate_content_config,
):
# just a simple progress indicator
num_chunks_received += 1
print(".", end="")
if num_chunks_received % 40 == 0:
print("")
# measuring time to first audio
if not is_first_chunk_received:
is_first_chunk_received = True
first_chunk_received_time = datetime.datetime.now()
if (
chunk.candidates is None
or not chunk.candidates
or chunk.candidates[0].content is None
or not chunk.candidates[0].content.parts
):
continue
part = chunk.candidates[0].content.parts[0]
if part.inline_data and part.inline_data.data:
# accumulating audio. In a web-server scenario, you would want to
# "emit" audio to the frontend as soon as it arrives.
#
# For example using flask socketio, you could do the following
# from flask_socketio import SocketIO, emit
# emit("audio", chunk.candidates[0].content.parts[0].inline_data.data)
# socketio.sleep(0)
final_audio_data += chunk.candidates[0].content.parts[0].inline_data.data
time_to_first_audio = first_chunk_received_time - request_start_time
time_to_completion = datetime.datetime.now() - request_start_time
print("\n")
print(f"Time to first audio: {time_to_first_audio.total_seconds()} seconds")
print(f"Time to completion: {time_to_completion.total_seconds()} seconds")
return final_audio_data
audio_data = synthesize(
prompt,
"gemini-2.5-flash-tts",
"Kore",
"en-in")
file_name='output_speech.wav'
wave_file(file_name, audio_data)
Audio("output_speech.wav")
ביצוע סינתזת דיבור בסטודיו למדיה
אתם יכולים להשתמש ב-Media Studio במסוף Google Google Cloud כדי להתנסות במודלים של המרת טקסט לדיבור (TTS). הממשק הזה מאפשר ליצור במהירות אודיו מסונתז, להאזין לו ולהתנסות בהוראות ובפרמטרים שונים של סגנון.
במסוף Google Google Cloud , עוברים לדף Vertex AI Studio > Media Studio.
בתפריט הנפתח של המדיה, בוחרים באפשרות דיבור.
בשדה הטקסט, מזינים את הטקסט שרוצים להפוך לדיבור.
בחלונית הגדרות, קובעים את ההגדרות הבאות:
- מודל: בוחרים את מודל Cloud TTS (TTS) שרוצים להשתמש בו, כמו
Gemini 2.5 Pro TTS. מידע נוסף על המודלים הזמינים מופיע במאמר מודלים של Cloud TTS. - הוראות לגבי הסגנון: אופציונלי: מזינים הנחיית טקסט שמתארת את סגנון הדיבור, הטון וההבעה הרגשית שנבחרו. כך תוכלו לשפר את ביצועי המודל מעבר לקריינות שמוגדרת כברירת מחדל. לדוגמה: "תקריין בקול רגוע ומקצועי לסרט תיעודי".
- שפה: בוחרים את השפה והאזור של טקסט הקלט. המודל יוצר דיבור בשפה ובמבטא שנבחרו. לדוגמה, אנגלית (ארצות הברית).
- קול: בוחרים קול מוגדר מראש לקריינות. הרשימה כוללת את הקולות שזמינים למודל ולשפה שנבחרו, כמו Acherner (Female).
- מודל: בוחרים את מודל Cloud TTS (TTS) שרוצים להשתמש בו, כמו
אופציונלי: מרחיבים את הקטע 'אפשרויות מתקדמות' כדי להגדיר הגדרות טכניות של אודיו:
- קידוד אודיו: בוחרים את הקידוד של קובץ האודיו שיוצא.
LINEAR16הוא פורמט לא דחוס ללא איבוד נתונים שמתאים לעיבוד אודיו באיכות גבוהה. אפשר להשתמש ב-MULAWגם לפלט אודיו דחוס. - תדירות דגימת האודיו: בוחרים את תדירות הדגימה בהרץ (Hz). ההגדרה הזו קובעת את איכות האודיו. ערכים גבוהים יותר כמו 44,100 הרץ מייצגים אודיו באיכות גבוהה יותר, ששווה לאיכות של תקליטור.
- מהירות: כדי לשנות את מהירות הדיבור, מזיזים את פס ההזזה או מזינים ערך. ערכים קטנים מ-1 מאטים את הדיבור, וערכים גדולים מ-1 מאיצים אותו. ערך ברירת המחדל הוא 1.
- הגברת עוצמת הקול (db): כאן משנים את עוצמת הקול של פלט האודיו בדציבלים (dB). ערכים חיוביים מגבירים את עוצמת הקול, וערכים שליליים מנמיכים אותה. ערך ברירת המחדל הוא 0.
- קידוד אודיו: בוחרים את הקידוד של קובץ האודיו שיוצא.
כדי ליצור את האודיו, לוחצים על סמל השליחה משמאל לתיבת הטקסט.
האודיו שנוצר יופיע בנגן המדיה. לוחצים על לחצן ההפעלה כדי להאזין לפלט. אתם יכולים להמשיך לשנות את ההגדרות וליצור גרסאות חדשות לפי הצורך.
טיפים לכתיבת הנחיות
כדי ליצור אודיו מעניין וטבעי מטקסט, צריך להבין את הניואנסים של השפה המדוברת ולתרגם אותם לפורמט של תסריט. הטיפים הבאים יעזרו לכם ליצור תסריטים שנשמעים אותנטיים ומשקפים את הטון שבחרתם.
שלושת המנופים לשליטה בדיבור
כדי לקבל את התוצאות הכי צפויות ומדויקות, חשוב לוודא שכל שלושת הרכיבים הבאים עולים בקנה אחד עם הפלט הרצוי.
הנחיה לסגנון הגורם העיקרי שמשפיע על הטון הרגשי הכללי ועל אופן ההעברה. ההנחיה מגדירה את ההקשר של כל קטע הדיבור.
לדוגמה:
You are an AI assistant speaking in a friendly and helpful tone.לדוגמה:
Narrate this in the calm, authoritative tone of a nature documentary narrator.
תוכן טקסט המשמעות הסמנטית של המילים שאתם מסנתזים. ביטוי מעורר רגשות שתואם מבחינה רגשית להנחיית הסגנון יניב תוצאות אמינות הרבה יותר מטקסט ניטרלי.
טוב: הנחיה לטון מפוחד פועלת בצורה הטובה ביותר עם טקסט כמו
I think someone is in the house.פחות יעילה: הנחיה ליצירת טון מפוחד עם טקסט כמו
The meeting is at 4 PM.תניב תוצאות לא חד-משמעיות.
תגי עיצוב (גרסת Preview)
תגים עם סוגריים כמו [sigh] מתאימים בעיקר להוספת פעולה ספציפית ומקומית או לשינוי סגנון, ולא להגדרת הטון הכללי. הם פועלים יחד עם הנחיית הסגנון ותוכן הטקסט.
מדריך לתגי עיצוב
מהמחקר שלנו עולה שתגי עיצוב עם סוגריים פועלים באחד משלושה מצבים שונים. כדי להשתמש בתג בצורה יעילה, חשוב להבין את המצב שלו.
מצב 1: קולות שאינם דיבור
תגי העיצוב מוחלפים בהשמעה קולית שאינה דיבור (למשל אנחה או צחוק). התג עצמו לא נאמר. התכונות האלה מצוינות להוספת היסוסים ותגובות מציאותיים שדומים לאלה של בני אדם.
| תג | התנהגות | אמינות | הדרכה |
|---|---|---|---|
[sigh] |
הוספת צליל של אנחה. | גבוהה | האיכות הרגשית של האנחה מושפעת מההנחיה. |
[laughing] |
הוספת צחוק. | גבוהה | כדי לקבל את התוצאות הטובות ביותר, כדאי להשתמש בהנחיה ספציפית. לדוגמה, הנחיה כללית עשויה ליצור צחוק של הלם, בעוד שהנחיה 'תגיב בצחוק משועשע' יוצרת צחוק של שעשוע. |
[uhm] |
הוספת צליל של היסוס. | גבוהה | האפשרות הזו שימושית ליצירת תחושה טבעית יותר של שיחה. |
מצב 2: שינויים בסגנון
תגי העיצוב לא נאמרים, אבל הם משנים את אופן ההשמעה של הדיבור שבא אחריהם. ההיקף ומשך הזמן של השינוי יכולים להשתנות.
| תג | התנהגות | אמינות | הדרכה |
|---|---|---|---|
[sarcasm] |
הוספת טון סרקסטי לביטוי הבא. | גבוהה | התג הזה הוא משנה רב עוצמה. היא מדגימה שאפשר להשתמש במושגים מופשטים כדי להנחות את המודל בהצלחה. |
[robotic] |
גורם לכך שהדיבור הבא יישמע רובוטי. | גבוהה | ההשפעה יכולה להיות על ביטוי שלם. כדי לקבל את התוצאות הטובות ביותר, עדיין מומלץ להשתמש בהנחיה לסגנון (למשל, "תגיד את זה כמו רובוט"). |
[shouting] |
מגביר את עוצמת הקול של הדיבור הבא. | גבוהה | הכי יעיל כשמשתמשים בו עם הנחיה תואמת לסגנון (למשל, "תצעק את החלק הבא") ועם טקסט שמשמעותו צעקה. |
[whispering] |
החלשת עוצמת הקול של הדיבור שייאמר אחריו. | גבוהה | כדי לקבל את התוצאות הכי טובות, כדאי שההנחיה לגבי הסגנון תהיה גם היא מפורשת (לדוגמה, "עכשיו תלחש את החלק הזה הכי בשקט שאפשר"). |
[extremely fast] |
הגברת המהירות של הדיבור הבא. | גבוהה | מתאים במיוחד להצגת כתבי ויתור או לדיאלוג מהיר. נדרשת תמיכה מינימלית בהנחיות. |
מצב 3: תגי עיצוב עם הגייה (שמות תואר)
תג העיצוב עצמו מושמע כמילה, וגם משפיע על הטון של המשפט כולו. ההתנהגות הזו רלוונטית בדרך כלל לשמות תואר שמתארים רגשות.
אזהרה: מכיוון שהתג עצמו מושמע, סביר להניח שהמצב הזה הוא תופעת לוואי לא רצויה ברוב תרחישי השימוש. מומלץ להשתמש בהנחיית הסגנון כדי להגדיר את הטונים הרגשיים האלה.
| תג | התנהגות | אמינות | הדרכה |
|---|---|---|---|
[scared] |
המילה "scared" (מפוחד) נאמרת, והמשפט מקבל טון מפוחד. | גבוהה | הביצועים תלויים מאוד בתוכן הטקסט. הביטוי "I just heard a window break" (שמעתי עכשיו חלון נשבר) מניב תוצאה של פחד אמיתי. ביטוי ניטרלי יניב תוצאה "מפחידה" אבל פחות אותנטית. |
[curious] |
המילה "סקרן" נאמרת, והמשפט מקבל טון סקרן. | גבוהה | כדאי להשתמש בניסוח שמעורר סקרנות כדי לתמוך בכוונה של התג. |
[bored] |
המילה "משעמם" נאמרת, והמשפט נאמר בטון משעמם ומונוטוני. | גבוהה | כדי להשיג את האפקט הטוב ביותר, מומלץ להשתמש בו עם טקסט רגיל או חוזר. |
מצב 4: קצב והפסקות
התגים האלה מוסיפים שקט לאודיו שנוצר, ומאפשרים לכם לשלוט בקצב, בתזמון ובמהירות של הדיבור. גם סימני פיסוק רגילים (פסיקים, נקודות, נקודות ופסיקים) יוצרים הפסקות טבעיות, אבל התגים האלה מאפשרים שליטה מפורשת יותר.
| תג | התנהגות | אמינות | הדרכה |
|---|---|---|---|
[short pause] |
מוסיפה הפסקה קצרה, בדומה לפסיק (כ-250 אלפיות השנייה). | גבוהה | משתמשים בה כדי להפריד בין סעיפים או פריטים ברשימה, כדי לשפר את הבהירות. |
[medium pause] |
הוספת השהיה רגילה, בדומה להפסקת משפט (כ-500 אלפיות השנייה). | גבוהה | יעיל להפרדה בין משפטים או מחשבות שונות. |
[long pause] |
הוספת הפסקה משמעותית ליצירת אפקט דרמטי (כ-1,000 מילי-שניות ומעלה). | גבוהה | לשימוש בתזמון דרמטי. לדוגמה: "התשובה היא... [long pause] ...לא." לא מומלץ להשתמש בהם יותר מדי, כי זה עלול להישמע לא טבעי. |
אסטרטגיות מרכזיות להשגת תוצאות מהימנות
התאמה בין שלושת המנופים: כדי להשיג את רמת החיזוי הגבוהה ביותר, חשוב לוודא שהנחיית הסגנון, תוכן הטקסט ותגי העיצוב פועלים באופן עקבי מבחינה סמנטית ומובילים לאותו יעד.
השתמשו בטקסט עשיר ברגשות: אל תסתמכו רק על הנחיות ותגים. לתת למודל טקסט עשיר ותיאורי לעבוד איתו. זה חשוב במיוחד כשמדובר ברגשות מורכבים כמו סרקזם, פחד או התרגשות.
כדאי לכתוב הנחיות ספציפיות ומפורטות: ככל שההנחיה לגבי הסגנון תהיה ספציפית יותר, כך התוצאה תהיה מהימנה יותר. עדיף להשתמש בביטוי "תגיב בצחוק משועשע" מאשר רק באמוג'י
[laughing]. ההנחיה "תדבר כמו קריין חדשות ברדיו משנות ה-40" עדיפה על ההנחיה "תדבר בצורה מיושנת".בודקים ומאמתים תגים חדשים: ההתנהגות של תג חדש או כזה שלא נבדק לא תמיד צפויה. יכול להיות שתג שאתם חושבים שהוא משנה סגנון יבוטא. תמיד כדאי לבדוק שילוב חדש של תג או הנחיה כדי לוודא שהוא פועל כמו שרוצים לפני שפורסים אותו בסביבת הייצור.
החלשת מסנני הבטיחות
אפשר להשתמש בשדה relax_safety_filters בקטע AdvancedVoiceOptions.
החלשת מסנני הבטיחות תוריד את סף החסימה של תוכן פוגעני מסינתוז.
בדוגמאות הקוד האלה מודגם איך להתאים אישית את הגדרות הבטיחות ב-Cloud Text-to-Speech API. לדוגמאות לשימוש ב-Vertex AI API, אפשר לעיין בדוגמאות ל-Vertex AI API.
Python
# google-cloud-texttospeech minimum version 2.32.0 is required.
request = texttospeech.SynthesizeSpeechRequest(
input=synthesis_input,
voice=voice,
audio_config=audio_config,
advanced_voice_options=texttospeech.AdvancedVoiceOptions(
relax_safety_filters=True,
),
)
# Perform the text-to-speech request on the text input with the selected
# voice parameters and audio file type.
response = client.synthesize_speech(request=request)
CURL
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following in a curious way",
"text": "I am saying something that would otherwise be blocked by Gemini TTS."
},
"voice": {
"languageCode": "en-us",
"name": "Kore",
"modelName": "gemini-2.5-flash-tts"
},
"audioConfig": {
"audioEncoding": "LINEAR16"
},
"advancedVoiceOptions": {
"relaxSafetyFilters": true
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit