close menu

מדריך: יצירת קול ריאליסטי מטקסט

נכון בסרט Terminator 3 המחסל מדבר בטלפון עם שרה קונור בקול של בן הזוג שלה?
מזל טוב לנו! הגענו ל"עתיד"!
בכמה שורות קוד פשוטות תוכל גם הבינה המלאכותית שלכם לעבוד על שרה קונור ולהשמיד את האנושות! 

הדגמה – תרגום קול אדם לאדם אחר: https://huggingface.co/spaces/Matthijs/speecht5-vc-demo

לפני שנתחיל, סכנות:
שתי מילים על שערורית הDeep Fakes החדשה:

התלבטתי כמה ימים אם להזכיר את הבלאגן המתרחש כרגע סביב Deep Fakes, אני חושב שבפוסט העוסק ביצירת קול ריאליסטי ראוי להזכיר את הסכנות שבטכנולוגיה גם אם רק בכמה מילים

בשבוע שעבר סטרימר מפורסם (מהגדולים בעולם) עבר בין חלונות פתוחים ולשבריר שניה נראה על המסך חלון דפדפן פתוח ובו אתר עם סרטוני Deep Fakes פורנוגרפים של אנשים שאינם הסכימו לכך (ולא ידעו על כך עד אותו הרגע).
חשיפת האתר למיליוני אנשים בזמן אמת הובילה לחקירת היקף התופעה שמסתברת כרחבה מאוד. שימוש לרעה מסוג זה דוחה ומזעזע. חשוב להזכיר באותה הנשימה כי טכנולוגיה זו נגישה במיוחד ואנו ככל הנראה הולכים לראות עוד ועוד מקרים מסוג זה לצערנו.

זה רק עניין של זמן: הטכנולוגיה הולכת והופכת לנגישה יותר ויותר ובעתיד הקרוב (מאוד) נגיע לנקודה בה כל אחד יוכל להשתמש בה על מנת לייצר קטעי וידאו ריאליסטים במיוחד בהם כל אדם אומר כל דבר בקולו האמיתי.

יצירת קול ריאליסטי: שחקנית חדשה – ElevenLabs
האינטרנט מתלהב (או מזדעזע תלוי את מי שואלים) לאחרונה משחקנית חדשה שנכנסה לזירת "הבינה המלאכותית" – ElevenLabs.
הפלטפורמה אותה היא מציעה ללקוחותיה מאפשרת יצירת קול ריאליסטי במיוחד מטקסט ודגימת קול קצרה.
התהליך עצמו פשוט: העלו קטע קול בו ניתן לשמוע את אותו האדם מדבר ומעכשיו בהנתן טקסט תוכלו לייצר קטע קול בו אותו האדם אומר כל דבר שתרצו.
זה עובד טוב? ראוי לציין כי הקול הנוצר בפלטפורמה זו ריאליסטי במיוחד (הכי טוב שאני שמעתי) ומצליח ללכוד מאפיינים עדינים מאוד כמו נשימות, עצירה בין משפטים, "מממ" וכו'.

יצירת קול ריאליסטי: הקוד הפתוח

מדריך: כך תאמנו מודל משלכם ליצירת קול ריאליסטי מטקסט
מאמר: SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing
לפני כמה שעות עלה המודל SpeechT5 לHuggingFace.
בו תוכלו להשתמש אם ברצונכם לייצר מודל ש"מדבר" בקול לבחירתכם.
המודל SpeechT5 תואר במקור במאמר SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing מבית מיקרוסופט [1] והמשקולות המאומנות פתוחות לשימוש הקהל הרחב בHuggingface Hub.
על המודל:
כמו שמו מרמז, המודל בנוי משני חלקים: מקודד ומפענך (כמו כל מודלי T5) כשלכל אחד מהם שתי כניסות האחת לטקסט והאחת לפירוק ספקטרוגרמה של גל קול. ומכאן שניתן להשתמש בחלקי המודל השונים לביצוע כמה סוגי משימות שונות:
  • קול -> טקסט: בעיקר עבור זיהוי דיבור אוטומטי או זיהוי דובר.
  • טקסט -> קול: יצירת קול אוטומטי
  • קול -> קול: תרגום דיבור אדם אחד לדיבור אדם אחר.

זהו. קול -> קול = אנחנו חיים בTerminator. הלך עלינו.

מבנה המודל
הרעיון המרכזי מאחורי המודל הוא אימון הכל -> הכל: מודל יחיד מתאמן על כמה סוגי משימות במקביל טקסט לדיבור, דיבור לטקסט, טקסט לטקסט ודיבור לדיבור.
כך אותו המודל המודל לומד גם מטקסט וגם ומדיבור בו זמנית מולטימודאלית. התוצאה של גישה זו היא שהמודל לומד מרחב נסתר מאוחד בו כל היצוגים הנסתרים נמצאים, גם טקסט וגם דיבור.
בליבו של המודל SpeechT5 נמצא מודל T5 מקודד-מפענח טרנספורמר רגיל. ובדיוק כמו כל אימון טרנספורמר אחר רשת זו לומדת טרנספורמצית רצף לרצף באמצעות יצוג נסתר.
כדי לאפשר לאותו המודל להתמודד עם נתוני הטקסט והדיבור באותו המודל נוספו תת-רשתות חדשות לפני הטרנספורמר עצמו שתפקידן לקודד את הטקסט ואת הקול ולהמירם לטוקנים אותם לומד הטרנספורמר המלא.
באופן דומה, לאחר המפענח נוספו גם תת-רשתות שתפקידן לפענן את תוצאת המפענח לקול וטקסט בו זמנית.
איך אימנו את המודל?
אימון המודל בוצע מקצה-לקצה (end-to-end) ונעשה שימוש בכל הרשתות ותת הרשתות בו זמנית. לאחר האימון המלא כל "מסלול" ברשת אומן Fine-tuning למשימה הספציפית עליו לבצע (טקסט->קול, קול->טקסט, קול->קול)
באימון זה משקולות הטרנספורמר הגדול הוקפאו והאימון בוצע רק לרשתות הקידוד והפענוח.
הערה: למרות כי במודל המקורי משקולות המודל משותפות, משקולות מודלי המשימות השונות שונים משמעותית ובמידה ותרצו להשתמש במודל על מנת לבצע משימה מסוימת עליכם לשים לב באילו משקולות אתם משתמשים. לא תקבלו תוצאות טובות אם תשתמשו במשקולות קול->טקסט עבור קול->קול למשל.

מדריך פרקטי: איך תכלס עושים את זה?

משימה: טקסט -> קול
את המודל תטענו כך:
from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts")
model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts")
וכך תשתמשו בו:
inputs = processor(text="Don't count the days, make the days count.", return_tensors="pt")
spectrogram = model.generate_speech(inputs["input_ids"], speaker_embeddings)
המודל עצמו מצפה לקבל טקסט מקודד (כמו כל טרנספורמר טקסט אחר) ותפקידו הוא "לנחש" את השארית שיש להוסיף לספקטרוגרמת הפלט. (כמו בTacotron 2). שימו לב שישנו גם Speaker Embedding המכיל את המידע הנדרש למודל על מנת "לדבר" בקול של אדם ספציפי. למתעניינים באימון המודל עבור קול ספציפי משלהם, הסתכלו במחברת הקולאב המצורפת.

דגש: אם ברצונכם לאמן את המודל, מפענח המודל מקבל log mel ספקטרוגרמה. כמו בTacotron 2.

הפיכת תוצאת המודל לקטע קול:
דוגמה:
from transformers import SpeechT5HifiGan
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
speech = vocoder(spectrogram)
speech = model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=vocoder)
משימה: קול -> קול
באופן דומה, נטען את המודל ואת העיבוד המקדים למודל:
import torch
from datasets import load_dataset
from transformers import SpeechT5HifiGan
from transformers import SpeechT5Processor, SpeechT5ForSpeechToSpeech
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_vc")
model = SpeechT5ForSpeechToSpeech.from_pretrained("microsoft/speecht5_vc")
עכשיו נטען את קול המקור אותו נרצה לתרגם וכמו כן את "דובר היעד" בקולו נרצה "לדבר":
dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation").sort("id")
inputs = processor(audio=dataset[40]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")
speech = model.generate_speech(inputs["input_values"], speaker_embeddings, vocoder=SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan"))
משימה: קול -> טקסט
משימת הקול לטקסט מבוצעת באופן דומה, טעינת חלקי הרשת המתאימים ושימוש במודל על מנת להמיר את הקול לטקסט. למתעניינים – בקרו במחברת הקולאב.
לסיכום:

הלך עלינו. עכשיו גם להקלטות קול אי אפשר להאמין.

המודל החדש – SpeechT5 מודל מעניין מהכיוון שמאפשר על גבי אותו המודל לבצע מספר משימות רב, הוא גם מכיל רכיבי קידוד ופענוח מיוחדים לסוגי הדאטה השונים עליהם הוא פועל. זו גישה מצוינת שנראה כי קצת נשכחה בשנים האחרונות לטובת מודלי ענק המסוגלים לבצע הכל בעצמם ללא צורך בשינוי ארכיטקטורה.
בתמונה: ארכיטקטורת המודל.
עוד בנושא: