arielshemesh1999@gmail.com · ישראל
← כל המאמרים

ElevenLabs voice API

ה-voice stack שכל שאר התעשייה רודף אחריו — מסירה דרמטית עם v3 ב-70+ שפות, Flash v2.5 עם לייטנסי של ~75ms, שיבוט קול מיידי משלוש דגימות שמע, ו-ElevenAgents שמחבר ASR + LLM + TTS לשיחה realtime אחת.

מה זה

ElevenLabs מספקת את מודלי ה-text-to-speech ושיבוט הקול בעלי הנאמנות הגבוהה ביותר בשוק כיום, יחד עם מחסנית שיחה realtime שלמה. ה-Python SDK הרשמי (הריפו elevenlabs/elevenlabs-python, הפקג' הוא פשוט elevenlabs) מורשה ב-MIT, נמצא כעת בגרסה v2.53.0 (15 ביוני 2026, נכון ליוני 2026), ועוטף את ה-REST + WebSocket API. אותו ממשק משוקף ב-@elevenlabs/elevenlabs-js עבור Node/TypeScript, עם SDKs נוספים שמתוחזקים לצד הליבה.

משטח המוצר נשען על ארבעה יסודות: Text-to-Speech (סינתזה מכל מחרוזת), Instant Voice Cloning (IVC) (בניית קול מותאם אישית מכמה דקות שמע), Speech-to-Speech (ביצוע מחדש של הקלטה קיימת בקול אחר תוך שמירה על האינטונציה), ו-Agents (המוצר השיחתי realtime, שמחבר ASR + LLM + TTS לצינור WebSocket דו-כיווני אחד). מעל הכל יושב Scribe, מודל ה-speech-to-text שמתמלל ב-99 שפות עם word-level timestamps ו-speaker diarization — אותו מודל שמספק את שלב ה-ASR בסוכנים.

איך זה עובד — ארכיטקטורה

כל מודל קול הוא transformer שאומן על זוגות שמע/טקסט. ה-SDK עצמו הוא לקוח דק: הוא בונה בקשות HTTPS אל api.elevenlabs.io, מאמת ב-header יחיד (xi-api-key), ועבור streaming ושיחה הוא פותח WebSocket ומחזיר את ה-bytes כ-iterator. הנקודה החשובה היא שכל הסינתזה הכבדה רצה אצלם בענן; הקוד שלך רק מזין טקסט ושואב audio chunks. ארבעת מודלי ה-TTS הזמינים פורסים נקודות שונות על עקומת הלייטנסי-איכות:

  • Eleven v3 (eleven_v3) — המודל האקספרסיבי ביותר, מסירה דרמטית ודיאלוג רב-דוברים טבעי, תומך בדירקטיבות audio-tag inline כגון [laughs], [whispers], [sighs]. 70+ שפות, עד 5,000 תווים לבקשה. הבחירה לנרציה, ספרי שמע ו-video VO.
  • Eleven Multilingual v2 (eleven_multilingual_v2) — האיכות היציבה ביותר על טקסטים ארוכים, 29 שפות, עד 10,000 תווים. מתאים לקולות מוצר ממותגים שצריכים להישמע זהים מהקלטה להקלטה.
  • Eleven Flash v2.5 (eleven_flash_v2_5) — לייטנסי מודל של ~75ms (ללא לייטנסי רשת ואפליקציה), 32 שפות, עד 40,000 תווים, וכ-50% זול יותר לתו. מודל ברירת המחדל לסוכני קול אינטראקטיביים.
  • Eleven Turbo v2.5 (eleven_turbo_v2_5) — סומן deprecated. התיעוד הרשמי קובע שהוא functionally equivalent ל-Flash v2.5 אך עם לייטנסי גבוה יותר, וממליץ לעבור ל-Flash. אל תתחיל פרויקט חדש סביבו.

פורמטי הפלט נקבעים בפרמטר output_format, ויש 28 וריאנטים: שבעה MP3 (כולל ברירת המחדל mp3_44100_128 ו-mp3_44100_192 שדורש tier Creator ומעלה), שבעה PCM, שבעה WAV, חמישה Opus, ושני פורמטים טלפוניים — alaw_8000 ו-ulaw_8000. הערה מעשית: PCM/WAV ב-44.1kHz דורש tier Pro ומעלה.

התקנה והגדרה

# Python
pip install elevenlabs

# Optional: mpv or ffmpeg, used by the play() helper
brew install mpv

# Node / TypeScript
npm install @elevenlabs/elevenlabs-js

הלקוח מקבל את המפתח ב-constructor. מומלץ לשמור אותו במשתנה סביבה ולטעון אותו (למשל עם python-dotenv) במקום לכתוב אותו בקוד:

export ELEVENLABS_API_KEY=sk_…
import os
from elevenlabs.client import ElevenLabs

elevenlabs = ElevenLabs(api_key=os.environ["ELEVENLABS_API_KEY"])

הלקוח נבנה פעם אחת ומשמש מחדש לכל הקריאות. לשרתים multi-tenant שבהם המפתח משתנה לכל בקשה, פשוט בונים מופע ElevenLabs חדש עם ה-api_key המתאים. ל-async יש מקבילה מלאה, AsyncElevenLabs, עם אותו עץ מתודות בדיוק.

פקדי הקול

מעבר לבחירת המודל וה-voice_id, אופי הפלט נשלט בארבעה פרמטרים שמועברים בכל בקשה (voice_settings):

  • stability (0.0–1.0) — נמוך = טווח רגשי גדול יותר ושונות גבוהה יותר בהגייה; גבוה = מונוטוני וצפוי. לסוכן ענייני אני מעדיף סביב 0.4–0.5.
  • similarity_boost (0.0–1.0) — עד כמה הפלט נצמד לקול הייחוס. ערך גבוה מדי יכול להגביר artifacts שהיו בהקלטת המקור.
  • style (0.0–1.0) — הגזמת סגנון; מעלה אקספרסיביות במחיר עקביות.
  • use_speaker_boost (bool) — מחדד את הדמיון לדובר.

מזהי הקול מגיעים מספריית הקולות הציבורית (elevenlabs.voices.search()) או מהשיבוטים האישיים שלך ב-IVC. הקול לדוגמה JBFqnCBsd6RMkjVDRZzb מופיע בכל הדוגמאות הרשמיות כקול אנגלי ברירת מחדל.

יכולות מרכזיות — קוד

TTS בסיסי — קריאה אחת, bytes של MP3 חוזרים, השמעה דרך mpv:

from elevenlabs.client import ElevenLabs
from elevenlabs.play import play

elevenlabs = ElevenLabs(api_key="YOUR_API_KEY")

audio = elevenlabs.text_to_speech.convert(
    text="The first move is what sets everything in motion.",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_v3",
    output_format="mp3_44100_128",
)

play(audio)

שמירה לדיסק — הפלט הוא iterator של chunks, אז כותבים אותו בלולאה:

with open("output.mp3", "wb") as f:
    for chunk in audio:
        f.write(chunk)

Realtime streaming — ה-bytes מתחילים להגיע בזמן שהמודל עדיין מסנתז את הסוף. זה ההבדל בין סוכן שמרגיש חי לבין כזה שתקוע על "חושב":

from elevenlabs import stream
from elevenlabs.client import ElevenLabs

elevenlabs = ElevenLabs(api_key="YOUR_API_KEY")

audio_stream = elevenlabs.text_to_speech.stream(
    text="This is a test of realtime streaming.",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_flash_v2_5",   # ~75ms model latency
    output_format="pcm_22050",
    voice_settings={
        "stability": 0.4,
        "similarity_boost": 0.75,
        "style": 0.2,
        "use_speaker_boost": True,
    },
)

stream(audio_stream)

Async streaming — לאינטגרציה בתוך pipeline של FastAPI / aiohttp. מזרימים כל chunk הלאה ללקוח מבלי לאגד את כל הקובץ בזיכרון:

import asyncio
from elevenlabs.client import AsyncElevenLabs

async def main():
    elevenlabs = AsyncElevenLabs(api_key="YOUR_API_KEY")
    audio = elevenlabs.text_to_speech.stream(
        text="Hello from async land.",
        voice_id="JBFqnCBsd6RMkjVDRZzb",
        model_id="eleven_flash_v2_5",
    )
    async for chunk in audio:
        # ship chunk to client over websocket
        ...

asyncio.run(main())

Instant Voice Cloning — מעלים כמה קבצי שמע נקיים של הדובר ומקבלים voice_id מותאם אישית לשימוש חוזר:

voice = elevenlabs.voices.ivc.create(
    name="Alex",
    description="An old American male voice with a slight hoarseness in his throat. Perfect for news",
    files=["./sample_0.mp3", "./sample_1.mp3", "./sample_2.mp3"],
)

print(voice.voice_id)   # use this as voice_id in future TTS calls

Speech-to-Speech — להריץ מחדש הקלטה קיימת בקול אחר, תוך שימור המקצב והאינטונציה של ההקלטה המקורית:

with open("./input.wav", "rb") as f:
    audio = elevenlabs.speech_to_speech.convert(
        voice_id=voice.voice_id,
        audio=f,
        model_id="eleven_multilingual_sts_v2",
        output_format="mp3_44100_192",
    )

Agents (Conversational AI) — הפלטפורמה אורזת ASR (מודל Scribe) + LLM לבחירתך + TTS ל-WebSocket דו-כיווני אחד. מגדירים את הסוכן בדשבורד (system prompt, מאגר ידע, כלים מורשים, קול) ומתחברים מהקוד. שימו לב לנתיבי ה-import המדויקים — שלוש מחלקות משלוש מודולות נפרדות:

from elevenlabs.client import ElevenLabs
from elevenlabs.conversational_ai.conversation import Conversation, ClientTools
from elevenlabs.conversational_ai.default_audio_interface import DefaultAudioInterface

elevenlabs = ElevenLabs(api_key="YOUR_API_KEY")
audio_interface = DefaultAudioInterface()

conversation = Conversation(
    client=elevenlabs,
    agent_id="your-agent-id",     # from the Agents dashboard
    requires_auth=True,           # only needed for non-public agents
    audio_interface=audio_interface,
)

conversation.start_session()
# user speaks, agent replies, all over one WebSocket
conversation.end_session()

עבור public agents אפשר להשמיט את המפתח ולהגדיר requires_auth=False. את ממשק השמע ניתן להחליף בכך שיורשים מ-elevenlabs.conversational_ai.conversation.AudioInterface, וכך לחבר מיקרופון/רמקול משלכם או לחווט את הסוכן ל-Media Streams של Twilio.

מתי להשתמש — בחירת מודל

בחירת המודל היא המנוף הגדול ביותר על עלות, לייטנסי ואיכות נתפסת. כלל אצבע מעשי לשימוש יומיומי:

  • נרציה / ספר שמע / video VO — Eleven v3. האקספרסיביות ודירקטיבות ה-audio-tag שוות את הלייטנסי הנוסף, ואין כאן אילוץ realtime.
  • סוכני קול realtime — Flash v2.5. ~75ms זמן מודל שומר על השיחה טבעית; כל תקציב לייטנסי מתבזבז ממילא על ה-LLM וה-ASR שלפניו.
  • קול מוצר ממותג ב-29 שפות — Multilingual v2. היציב ביותר על טקסטים ארוכים וחוזר על עצמו זהה מהקלטה להקלטה.
  • throughput גבוה / batch — גם כאן Flash v2.5. מאחר ש-Turbo v2.5 deprecated ושקול-פונקציונלית ל-Flash אך איטי יותר, אין סיבה אמיתית לבחור בו עוד; Flash הוא גם הזול והמהיר.

מגבלות וזהירות

השירות מנוהל-ענן ובתשלום לפי תו, כך שהעלות גדלה לינארית עם הטקסט — לכן בחירת המודל הזול-יותר (Flash) ב-batch גדול היא לא רק עניין של מהירות. הלייטנסי שמפורסם, ~75ms, הוא זמן מודל בלבד; ברגע שמוסיפים latency רשת והמתנה ל-LLM במעלה הזרם, ה-RTT שמרגישים בפועל גבוה יותר, ולכן streaming הוא חובה ולא נחמד-שיהיה. עוד מלכודת: Turbo v2.5 עדיין מתועד ועובד, אבל הוא בנתיב deprecation — קוד חדש צריך להצמיד eleven_flash_v2_5 במפורש.

הנקודה הרגישה ביותר היא משפטית-אתית: שיבוט קול הוא הפרימיטיב המסוכן ביותר במחסנית. ElevenLabs דורשת אימות הסכמה לפני יצירת IVC, והכלל הפשוט הוא לעולם לא לשבט קול שאינו שלך או שאין לך רשות מפורשת אליו. את מפתח ה-API מטפלים כמו כל secret — במשתני סביבה בלבד, אף פעם לא ב-repo, ומחליפים אותו מיד אם הוא דלף ללוגים או להיסטוריית גרסאות.

למה זה חשוב בפועל

בשימוש יומיומי המנוף הגדול הוא פער האיכות: v3 נשמע כמו אדם בעוד הרבה אלטרנטיבות עדיין נשמעות כמו מודל, ולייטנסי ה-streaming של Flash טוב מספיק כדי שתפסיק לשים לב אליו. שתי החלטות חוזרות על עצמן כמעט בכל אינטגרציה. הראשונה היא לבחור פורמט פלט שמתאים ליעד — למשל ulaw_8000, שנכנס ישר לערוצי טלפוניה כמו Media Streams של Twilio ללא המרה ומסיר שכבת glue שלמה שאחרת צריך לכתוב ידנית. השנייה היא להעדיף בצד שרת את הלקוח ה-async ולהזרים כל chunk הלאה אל גוף התגובה במקום לאגד את כל ה-MP3 בזיכרון — זה מה שמשאיר את התחושה realtime כשמספר משתמשים פונים במקביל. מניסיון, שווה גם לקבע מראש את ה-voice_id ואת ה-voice_settings שמתאימים לכל תרחיש, כדי שהקול יישמע עקבי מהקלטה להקלטה.

מקורות