Speech-to-Text הוא אחד משלושת ממשקי ה-API המאומנים מראש של Vertex AI ב-Google Distributed Cloud (GDC) air-gapped. השירות "המרת דיבור לטקסט" מזהה דיבור בקובצי אודיו ומתמלל את האודיו לטקסט. Speech-to-Text עומד בדרישות של מיקום אחסון הנתונים ושל תאימות.
בטבלה הבאה מתוארות היכולות העיקריות של Speech-to-Text:
| יכולות עיקריות | |
|---|---|
| תמלול | החלת אלגוריתמים מתקדמים של רשתות נוירונים של למידה עמוקה לזיהוי דיבור אוטומטי. |
| מודלים | פריסת מודלים של זיהוי שגודלם קטן מ-1GB וצורכים משאבים מינימליים. |
| תואם ל-API | אתם יכולים להשתמש ב-Speech-to-Text API ובספריות הלקוח שלו כדי לשלוח אודיו ולקבל תמלול טקסט משירות Speech-to-Text. |
קידודי האודיו הנתמכים ב-Speech-to-Text
Speech-to-Text API תומך בכמה קידודים שונים. בטבלה הבאה מפורטים קודקי האודיו הנתמכים:
| קודק | שם | ללא אובדן מידע | הערות לשימוש |
|---|---|---|---|
FLAC |
Free Lossless Audio Codec | כן | נדרש 16 סיביות או 24 סיביות לשידורים |
LINEAR16 |
PCM לינארי | כן | קידוד PCM לינארי של 16 ביט. הכותרת חייבת להכיל את תדירות הדגימה. |
MULAW |
μ-law | לא | קידוד PCM של 8 ביט |
OGG_OPUS |
פריימים של אודיו בקידוד Opus במאגר Ogg | לא | תדירות הדגימה צריכה להיות אחת מהבאות: 8,000Hz, 12,000Hz, 16,000Hz, 24,000Hz או 48,000Hz |
FLAC הוא גם קודק אודיו וגם פורמט קובץ אודיו. כדי לתמלל קובצי אודיו בקידוד FLAC, צריך לספק אותם בפורמט הקובץ .FLAC, שכולל כותרת עם מטא-נתונים.
Speech-to-Text תומך בקובצי WAV עם אודיו בקידוד LINEAR16 או MULAW.
למידע נוסף על קודקי אודיו של Speech-to-Text, עיינו במאמרי העזרה של AudioEncoding.
אם יש לכם אפשרות לבחור את הקידוד של חומר המקור, השתמשו בקידוד ללא אובדן מידע כמו FLAC או LINEAR16 כדי לשפר את זיהוי הדיבור.
תכונות של המרת דיבור לטקסט (STT)
ב-Speech-to-Text ב-Distributed Cloud יש שלוש שיטות לזיהוי דיבור:
זיהוי סינכרוני: שליחת נתוני אודיו ל-Speech-to-Text API, זיהוי הנתונים האלה והחזרת תוצאות אחרי עיבוד האודיו. בקשות לזיהוי סינכרוני מוגבלות לנתוני אודיו של דקה אחת או פחות.
זיהוי אסינכרוני: שליחת נתוני אודיו ל-Speech-to-Text API והתחלת פעולה ממושכת. באמצעות הפעולה הזו, אתם יכולים לבצע דגימה של תוצאות הזיהוי מדי פעם. אפשר להשתמש בבקשות לא סנכרוניות לנתוני אודיו בכל משך זמן עד 480 דקות.
זיהוי בסטרימינג: זיהוי של נתוני אודיו שסופקו בסטרימינג דו-כיווני. בקשות סטרימינג מיועדות לזיהוי בזמן אמת, כמו קליטת אודיו בשידור חי ממיקרופון. זיהוי בסטרימינג מספק תוצאות ביניים בזמן שהאודיו נקלט, וכך מאפשר לתוצאות להופיע, למשל, בזמן שהמשתמש עדיין מדבר.
הבקשות מכילות פרמטרים של הגדרות אישיות ונתוני אודיו. בקטעים הבאים נתאר את בקשות הזיהוי האלה, את התגובות שהן יוצרות ואיך לטפל בתגובות האלה בפירוט רב יותר.
בקשות ותשובות סנכרוניות
בקשה לזיהוי סינכרוני של המרת דיבור לטקסט היא השיטה הפשוטה ביותר לזיהוי של נתוני אודיו של דיבור. Speech-to-Text יכול לעבד עד דקה אחת של נתוני אודיו של דיבור שנשלחים בבקשה סנכרונית. אחרי ש-Speech-to-Text מעבד ומזהה את כל האודיו, הוא מחזיר תשובה.
Speech-to-Text חייב להחזיר תשובה לפני עיבוד הבקשה הבאה. בדרך כלל, Speech-to-Text מעבד אודיו מהר יותר מאשר בזמן אמת. בממוצע, עיבוד של 30 שניות אודיו נמשך 15 שניות. אם איכות האודיו נמוכה, בקשת הזיהוי עשויה להימשך זמן רב יותר.
בקשות לזיהוי דיבור
בקשת API סינכרונית ל-Speech-to-Text מורכבת מהגדרת זיהוי דיבור ומנתוני אודיו.
בדוגמאות הבאות אפשר לראות איך שולחים בקשה סינכרונית לזיהוי דיבור:
Python
import google.auth
from google.auth.transport import requests
from google.api_core.client_options import ClientOptions
from google.cloud import speech_v1p1beta1 as speech
audience = "https://ENDPOINT:443"
api_endpoint = "ENDPOINT:443"
try:
creds, _ = google.auth.default()
creds = creds.with_gdch_audience(audience)
def_req = requests.Request()
creds.refresh(def_req)
except Exception as e:
print("Caught exception", e)
raise e
client = speech.SpeechClient(
credentials=creds,
client_options=ClientOptions(api_endpoint=api_endpoint),
)
with open("SPEECH_FILE", "rb") as audio_file:
content = audio_file.read()
audio = speech.RecognitionAudio(content=content)
config = speech.RecognitionConfig(
encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=16000,
audio_channel_count=1,
language_code="en-US",
)
response = client.recognize(
config=config,
audio=audio,
metadata=[("x-goog-user-project", "projects/PROJECT_ID")],
)
print(response)
מחליפים את מה שכתוב בשדות הבאים:
-
ENDPOINT: נקודת הקצה של Speech-to-Text שבה משתמשים בארגון. למידע נוסף על סטטוס השירות ונקודות הקצה -
SPEECH_FILE: הנתיב לקובץ האודיו שרוצים לתמלל. PROJECT_ID: מזהה הפרויקט.
curl (JSON)
ב-Distributed Cloud, שער ה-Speech-to-Text API משרת את gRPC באמצעות speech_v1p1beta1, ולא מאפשר המרת קידוד של HTTP/JSON REST כברירת מחדל. משתמשים בלקוח Python speech_v1p1beta1 gRPC הקודם ב-Distributed Cloud.
אם מופעלת המרת קידוד של HTTP/JSON, צריך להגדיר את הבקשה בפורמט הבא:
curl -X POST \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-H "x-goog-user-project: projects/PROJECT_ID" \
--data '{
"config": {
"encoding": "FLAC",
"sampleRateHertz": 16000,
"languageCode": "en-US",
"audioChannelCount": 1
},
"audio": {
"content": "ZkxhQwAAACIQABAAAAUJABtAA+gA8AB+W8FZndQvQAyjv..."
}
}' \
"https://ENDPOINT:443/v1p1beta1/speech:recognize"
מחליפים את מה שכתוב בשדות הבאים:
-
TOKEN: אסימון האימות שקיבלתם. PROJECT_ID: מזהה הפרויקט.-
ENDPOINT: נקודת הקצה של Speech-to-Text שבה משתמשים בארגון. למידע נוסף על סטטוס השירות ונקודות הקצה
כל בקשות הזיהוי הסינכרוניות של Speech-to-Text חייבות לכלול שדה config של זיהוי דיבור מסוג RecognitionConfig. אובייקט RecognitionConfig מכיל את שדות המשנה הנדרשים הבאים:
-
encoding: מציין את שיטת הקידוד של האודיו שסופק. השדה הזה הוא מסוגAudioEncoding. אם יש לכם אפשרות לבחור קודק, עדיף לבחור בקידוד ללא אובדן מידע כמוFLACאוLINEAR16כדי לקבל את הביצועים הכי טובים. כאן תוכלו למצוא רשימה של פורמטים נתמכים לקידוד אודיו ב-Speech-to-Text. -
sample_rate_hertz: מציין את תדירות הדגימה של האודיו שסופק, בהרץ (8000-48000). מידע נוסף על תדירויות דגימה זמין בקטע תדירויות דגימה. השדהsample_rate_hertzנדרש לקידודיםLINEAR16,FLACו-MULAW(כולל קובצי WAV). -
audio_channel_count: מציין את מספר הערוצים בנתוני האודיו של הקלט (1-8, למשל1לאודיו מונו). השדהaudio_channel_countנדרש לאודיו בפורמטיםLINEAR16,FLACו-MULAW. -
language_code: מכיל את השפה והאזור שבהם צריך להשתמש לזיהוי הדיבור של האודיו שסופק. קוד השפה חייב להיות מזהה BCP-47. קודי שפה מורכבים מתגי שפה ראשיים ומתגי משנה משניים של אזור, שמציינים ניבים. בדוגמה,enמייצג את השפה האנגלית ו-USמייצג את ארצות הברית. כאן אפשר לעיין ברשימת השפות הנתמכות.
למידע נוסף ולתיאור של שדות משנה אופציונליים שאפשר לכלול בשדה config, קראו את המאמר RecognitionConfig.
שולחים אודיו ל-Speech-to-Text באמצעות הפרמטר audio מסוג RecognitionAudio.
השדה audio מכיל את שדה המשנה הבא:
-
content: מכיל את האודיו להערכה, שמוטמע בתוך הבקשה. הבייטים של נתוני האודיו מקודדים באמצעות ייצוג בינארי טהור. בייצוגים של JSON נעשה שימוש ב-Base64. מידע נוסף זמין במאמר תוכן אודיו מוטמע. משך האודיו שמועבר ישירות בשדה הזה מוגבל לדקה אחת.
תדירויות דגימה
אתם מציינים את תדירות הדגימה של האודיו בשדה sample_rate_hertz של הגדרת הבקשה, והיא חייבת להתאים לתדירות הדגימה של תוכן האודיו המשויך. Speech-to-Text תומך בתדירויות דגימה בין 8,000Hz ל-48,000Hz (8000-48000). השדה sample_rate_hertz נדרש לקידודים LINEAR16, FLAC ו-MULAW (כולל קובצי WAV).
אם יש לכם אפשרות לבחור את תדירות הדגימה כשאתם מקודדים את חומר המקור, כדאי להקליט את האודיו בתדירות דגימה של 16,000Hz. ערכים נמוכים יותר עלולים לפגוע בדיוק של זיהוי הדיבור, ולערכים גבוהים יותר אין השפעה משמעותית על איכות זיהוי הדיבור.
עם זאת, אם הקלטתם את נתוני האודיו בתדירות דגימה שונה מ-16,000Hz, אל תדגמו מחדש את האודיו ל-16,000Hz. לדוגמה, רוב האודיו של טלפוניה מדור קודם משתמש בתדירות דגימה של 8,000Hz, מה שעשוי להניב תוצאות פחות מדויקות. אם אתם חייבים להשתמש באודיו כזה, ספקו אותו ל-Speech-to-Text API בתדירות הדגימה המקורית שלו.
שפות
מנוע הזיהוי של Speech-to-Text תומך במגוון שפות וניבים. בשדה language_code של הגדרת הבקשה, מציינים את שפת האודיו (ואת הניב הלאומי או האזורי) באמצעות מזהה BCP-47.
בדף השפות הנתמכות מופיעה רשימה מלאה של השפות הנתמכות בכל תכונה.
בחירת מודל
כששולחים בקשה לתמלול אודיו אל Speech-to-Text, אפשר לעבד את קובצי האודיו באמצעות מודל למידת מכונה שאומן לזהות אודיו של דיבור מסוג המקור הספציפי הזה.
כדי להשתמש במודל ברירת המחדל לזיהוי דיבור ב-Distributed Cloud, צריך להשמיט את השדה model באובייקט RecognitionConfig או להגדיר את model לערך latest_long. אל תגדירו את model להיות default.
תוכן אודיו מוטמע
אודיו מוטמע נכלל בבקשה לזיהוי דיבור כשמעבירים פרמטר content בשדה audio של הבקשה. אם האודיו המוטמע מסופק כתוכן בבקשת REST, הוא צריך להיות תואם לסריאליזציה של JSON.
אפשר לשלוח נתונים ישירות בשדה content לזיהוי סינכרוני רק אם נתוני האודיו הם באורך של עד 60 שניות ובגודל של עד 10MB. כל נתוני האודיו בשדה content חייבים להיות בפורמט Base64.
כשיוצרים בקשה באמצעות ספריית לקוח, כותבים את הנתונים הבינאריים או הנתונים בקידוד Base64 ישירות בשדה content.
רוב סביבות הפיתוח כוללות כלי שירות של base64 לקידוד קובץ בינארי לנתוני טקסט ב-ASCII, ומספקות את הכלים והתמיכה הנדרשים.
בנוסף, ב-Python יש מנגנונים מובנים לקידוד תוכן ב-Base64. בדוגמאות הבאות מוסבר איך לקודד קובץ:
Linux
מקודדים את הקובץ באמצעות כלי שורת הפקודה base64. כדי למנוע גלישת שורות, משתמשים בדגל -w 0:
base64 INPUT_FILE -w 0 > OUTPUT_FILE
Python
ב-Python, מקודדים קובצי אודיו ב-Base64 באופן הבא:
# Import the base64 encoding library.
import base64
# Pass the audio data to an encoding function.
def encode_audio(audio):
audio_content = audio.read()
return base64.b64encode(audio_content)
תשובות לזיהוי דיבור
יכול להיות שיעבור קצת זמן עד שתתקבל תשובה סינכרונית מה-API להמרת דיבור לטקסט. אחרי העיבוד, ה-API מחזיר תגובה כמו בדוגמה הבאה:
{
"results": [
{
"alternatives": [
{
"transcript": "how old is the Brooklyn Bridge",
"words": [
{
"word": "how"
},
{
"word": "old"
},
{
"word": "is"
},
{
"word": "the"
},
{
"word": "Brooklyn"
},
{
"word": "Bridge"
}
]
}
]
}
]
}
כל התגובות לזיהוי סינכרוני של Speech-to-Text API כוללות תוצאות של זיהוי דיבור מסוג RecognizeResponse. אובייקט RecognizeResponse מכיל את השדות הבאים:
results: מכיל את רשימת התוצאות מסוגSpeechRecognitionResult, כאשר כל תוצאה תואמת לקטע אודיו. כל תוצאה מורכבת משדה משנה אחד או יותר מהשדות הבאים:
alternatives: מכיל רשימה של תמלילים אפשריים מסוגSpeechRecognitionAlternative. האפשרות הראשונה בתגובה היא תמיד הסבירה ביותר. כל חלופה מורכבת משדות המשנה הבאים:-
transcript: מכיל את הטקסט המתומלל. אם אתם מקבלים חלופות עוקבות, אתם יכולים לשרשר את התמלילים האלה יחד. -
words: מכיל רשימה של מידע ספציפי לכל מילה שזוהתה.
-
מידע נוסף זמין במאמר RecognizeResponse.
בקשות ותשובות אסינכרוניות
בקשת Speech-to-Text API אסינכרונית זהה בצורתה לבקשה סינכרונית. עם זאת, במקום להחזיר תשובה, הבקשה האסינכרונית מפעילה פעולה ממושכת ומחזירה את הפעולה הזו באופן מיידי. אפשר להשתמש בזיהוי דיבור אסינכרוני עם אודיו בכל אורך עד 480 דקות.
הדוגמה הבאה היא של תגובה לפעולה:
{
"name": "OPERATION_NAME",
"metadata": {
"@type": "type.googleapis.com/google.cloud.speech.v1p1beta1.LongRunningRecognizeMetadata",
"progressPercent": 34,
"startTime": "2016-08-30T23:26:29.579144Z",
"lastUpdateTime": "2016-08-30T23:26:29.826903Z"
}
}
שימו לב שעדיין אין תוצאות. השירות Speech-to-Text ממשיך לעבד את האודיו ומשתמש בפעולה הזו כדי לאחסן את התוצאות. התוצאות מופיעות בשדה response של הפעולה שמוחזרת כשהבקשה LongRunningRecognize מסתיימת.
הדוגמה הבאה מציגה תגובה מלאה אחרי השלמת הבקשה:
{
"name": "1268386125834704889",
"metadata": {
"lastUpdateTime": "2016-08-31T00:16:32.169Z",
"@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeMetadata",
"startTime": "2016-08-31T00:16:29.539820Z",
"progressPercent": 100
},
"response": {
"@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeResponse",
"results": [{
"alternatives": [{
"transcript": "how old is the Brooklyn Bridge",
"words": [
{
"word": "how"
},
{
"word": "old"
},
{
"word": "is"
},
{
"word": "the"
},
{
"word": "Brooklyn"
},
{
"word": "Bridge"
}
]
}]}]
},
"done": true
}
שימו לב שהשדה done מוגדר כ-true, והשדה response של הפעולה מכיל קבוצת תוצאות מסוג SpeechRecognitionResult, שהוא אותו סוג שמוחזר על ידי בקשת זיהוי סינכרונית.
בקשות ותשובות בסטרימינג
קריאת זיהוי בסטרימינג של Speech-to-Text API מיועדת לתיעוד ולזיהוי בזמן אמת של אודיו בסטרימינג דו-כיווני. האפליקציה יכולה לשלוח אודיו בזרם הבקשות ולקבל תוצאות זיהוי סופיות וזמניות בזמן אמת בזרם התגובות. תוצאות הביניים מייצגות את תוצאת הזיהוי הנוכחית של קטע אודיו, ותוצאת הזיהוי הסופית מייצגת את הניחוש האחרון והטוב ביותר של קטע האודיו הזה.
בקשות לזיהוי בסטרימינג
בניגוד לקריאות סינכרוניות ואסינכרוניות, שבהן שולחים גם את ההגדרות וגם את האודיו בבקשה אחת, כדי לשלוח קריאה ל-API של Speech-to-Text בסטרימינג צריך לשלוח כמה בקשות. ה-StreamingRecognizeRequest הראשון חייב להכיל הגדרה מסוג StreamingRecognitionConfig.
האובייקט StreamingRecognitionConfig מורכב מהשדה config, שמכיל את פרטי ההגדרות של האודיו מסוג RecognitionConfig, והוא זהה לזה שמוצג בבקשות סינכרוניות ובקשות לא סנכרוניות.
תגובות לזיהוי סטרימינג
תוצאות של זיהוי דיבור בסטרימינג מחזירות סדרה של תגובות מסוג StreamingRecognizeResponse.
תגובה כזו מורכבת מהשדות הבאים:
-
speech_event_type: מכיל אירועים מסוגSpeechEventType. הערך של האירועים האלה מציין מתי הושלמה אמירה אחת. אירועי הדיבור משמשים כסמנים בתגובה של הסטרימינג. -
results: מכיל את רשימת התוצאות, שיכולות להיות תוצאות ביניים או תוצאות סופיות מסוגStreamingRecognitionResult. הרשימהresultsכוללת את שדות המשנה הבאים:-
alternatives: מכיל רשימה של תמלילים חלופיים. -
is_final: מציין אם התוצאות שהתקבלו ברשומה הזו ברשימה הן זמניות או סופיות. -
result_end_time: מציין את הזמן שחלף מסוף התוצאה הזו ביחס לתחילת האודיו.
-