גישה חדשה לשיפור Text to Speech – הוספת Speaker verification למודל

מאת יואב רמון, 17 באפריל 2020

הבלוג פוסט נכתב במקור כפוסט על ידי יואב רמון בקבוצת Machine & Deep learning Israel

טוב, אז כמו שכתבתי אתמול ההרשמה השנה ל-ICASSP (International Conference on Acoustics, Speech, and Signal Processing) פתוחה וזאת הזדמנות מצויינת לחוות את הכנס הזה. רציתי לתת פה טעימה קטנה עם מאמר שבדיוק פורסם בכנס. זה מאמר שמאוד הרשים אותי והוא בתחום שיוצא לי לקרוא עליו הרבה לאחרונה, Text To Speech, אז החלטתי לכתוב עליו פה.

אז בשביל להתחיל להסביר את המאמר נסביר דבר ראשון איך מערכת TTS קלאסית עובדת:


1. נאסוף דאטא של דוגמאות רבות מאותו דובר (שעה+, לעתים אפילו יותר) שצריכות להיות מאוד נקיות ובאיכות מאוד גבוהה. את הדוגמאות האלה נצטרך לתמלל.


2. נאמן משהו שנקרא Vocoder (תוכנתי, לא פיזי) – המטרה של ה-Vocoder היא לייצר מייצוג קומפקטי של האודיו (בדרך כלל Mel scaled magnitude of STFT) בחזרה את הסיגנל הנקי. אחת הסיבות שעושים את האימון הזה בנפרד בדרך כלל היא שכדי לאמן Vocoder לא צריך לתמלל את הדוגמאות, ולכן אפשר לאמן אותו פשוט על כמויות גדולות של דוגמאות איכותיות. כמובן, אימון כזה הוא גם יותר ארוך ולכן ייקח יותר זמן. ישנן דוגמאות רבות ל-Vocoders כאלה, אבל המפורסם מכולם הוא Wavenet אם כי כבר מזמן הוא לא SOTA משום בחינה. זה קצת כמו ה-ResNet של עולם הקול.


3. נאמן את הרשת שלנו שתמיר מהתמלול (לרוב לא הטקסט עצמו אלא איזשהי המרה של הטקסט לפונמות) לייצוג הקומפקטי שבחרנו. המטריקה לאימון פה תהיה בדרך כלל איזשהי מטריקה של טעות כמו MAE\MSE בין התוצר של הרשת לבין הייצוג הקומפקטי.


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

אז מה הבעיה?

1. בעייה כללית בעולם הזה, שלא התייחסו אליה במאמר הזה, זה ש-Vocoders קלאסיים הם מאוד מאוד כבדים ומאוד מאוד איטיים. זאת אחת הסיבות שהרבה שנים, עד לשנה האחרונה בעצם, היה קשה לראות TTS ב-Runtime ובאיכות נורמאלית. זה תחום שיש בו התקדמות מטורפת בשנה-שנה וחצי האחרונות ואולי אני אכתוב על זה עוד פוסט מתישהו.

2. המודל מתאמן בעצם לייצר את הייצוג הקומפקטי של המאפיינים האקוסטיים, אבל למעשה זאת משימה שיכולה להיות לה תשובות מרובות. את אותו טקסט דוברים שונים יגידו בצורה שונה, ואפילו אותו דובר יכול להגיד את אותו הטקסט באינטונציות שונות, בקצב שונה ובמגוון של קולות. במערכת TTS קלאסית אין לנו דרך לשלוט בזה ואנחנו בעצם מנסים לחקות דובר ידוע (זה שעליו אספנו את הדאטא). התקדמות מסויימת בנושא נרשמה כאשר נעשה מעבר למערכות שבהן מחזיקים הרבה דאטא על כמה דוברים, ואז מאמנים כרגיל עם ה-Input כשבנוסף מכניסים לרשת גם איזשהו One-Hot Encoding של הדובר. באופן זה, לאחר מכן אפשר ב-Inference פשוט לשנות את ה-Encoding הזה לאחד מאלה שאימנו עליהם, ובדרך זו אפשר לקבל את אותו מקטע קול מכמה דוברים שונים בלי שתהיה רשת לכל דובר.

איזה בעיות זה לא פותר? זה לא פותר את הבעיה במקרים שבו אנו רוצים לאמן מודל על הרבה דוברים (100+) כי אז הוקטור One-Hot נהיה מאוד Sparse וקשה לעבוד איתו, וזה לא פותר מה קורה כשאין לנו הרבה דאטא, בוודאי לא דאטא נקי ובאיכות גבוהה, של הדובר שאנחנו רוצים לייצר את הקול שלו.

כאן נכנס המאמר (סוף סוף!):

בעצם מה שהם עשו במאמר זה בחרו להכניס לרשת ייצוג של מערכות Speaker verification (התאמה בין מקטע קול לבין זהות של דובר) בתור עוד פרמטר ברשת של Dual Source attention. חשוב לציין שהם לא המציאו את הרעיון של להכניס ייצוג ממערכות של SV וזה רעיון שנמצא בשימוש כבר שנים במערכות של Speech-To-Text. מה שהחוקרים הצליחו לעשות במאמר הזה בצורה מרשימה, היה שהם הראו שהם חקרו את הנושא הזה לעומק ובעקבות כך הגיעו לתוצאות מרשימות מאוד.

החוקרים ניסו גם להכניס ייצוגים קלאסיים שמשתמשים בהם ב-STT בשם I-Vectors ו-X-Vectors וגם ייצוג מודרני יותר שמתבסס על קלאסטרינג בשם LDE. שוב, על כל המערכות האלה אפשר לכתוב עוד פוסט שלם. בסוף בתוצאות הם הראו שאם משתמשים בייצוג של ה-LDE עם פרמטרים מסויימים, אפשר בהסתמך על ייצוג של דובר לא מוכר להגיע לתוצאות טובות (פחות או יותר) כמו על דובר שאימנת עליו (ולכן המאמר משווק כ-Zero Shot Learning).

אז איך משתמשים אחר כך במודל כזה? פשוט מכניסים את המקטע קול שיש לנו של הדובר לתוך מערכת כזאת של Speaker Verification, לוקחים את הייצוג הקומפקטי ומכניסים אותו לרשת יחד עם הטקסט שאנחנו רוצים שהאדם יגיד.
העבודה מרשימה גם בגלל שהם הציגו תוצאות של בדיקות איכות אנושיות של MOS ו-DMOS (איכות השמע על פי האוזן האנושית) ואז הראו כיצד פתרונות שמקבלים ציון יותר טוב ב-Loss של האימון מקבלות גם אחר כך ציון יותר טוב מבחינה שמיעתית.

כדי להתעמק עוד במאמר ממליץ לראות את ההרצאה של הכותבים:


אפשר גם לקרוא את המאמר המקורי (מאוד קריא וקצר, 4 עמודים נטו):


וכמובן לפשפש בקוד המקור (ב-Tensorflow! עם מודל מאומן!) שהם פרסמו, איכשהו בכל התחום של Voice יש תרבות מדהימה של שיתוף קוד ומודלים מאומנים ובתחום של TTS זה בולט במיוחד ש-99 אחוז מפרסמים קוד ומודלים:
https://github.com/nii-yamagishilab/multi-speaker-tacotron

הצטרפו לערוץ הטלגרם שלנו!

כל ההודעות שאתם לא רוצים לפספס

X