כבר הרבה זמן שאשתי מבקשת שיהיה לנו איך לשמוע מוסיקה בסלון. הבעיה למעשה התחילה עוד לפני הרבה שנים כשזנחתי את אוסף הדיסקים והעברתי את כולו לקבצים במחשב. מהסיבה הזו הרמקולים הטובים בבית (של bose) היו אלו שמחוברים למחשב. עד לאחרונה שולחן העבודה שלי ועליו המחשב היו בפינת הסלון וכך לא היתה בעיה לשמוע מוסיקה בכל הבית.
אבל בדירה הנוכחית, הוגליתי לעבוד בממד. את הרמקולים העברתי בשמחה למזנון בסלון, אבל לאן בעצם אפשר לחבר אותם ? יש לי מחשב בסלון ששימש בעבר כסטרימר, והיום משמש כשרת מדיה. אבל לא הצלחתי למצוא לו ממשק נוח ואמין שיהיה קביל על בנות הבית. אז נשארנו עם חוט של אוזניות שחיברנו לטלפונים או ללפטופ מזדמן. אבל זה ממש לא לעניין. התחלתי לברר על מקלט bluetooth זול, ואז הכה בי רעיון. למה לא לקנות amazon echo???
האמת הופתעתי לטובה. המוצר עובד בצורה יוצאת מהכלל. היא מבינה על מה שאומרים לה, מכל מקום בחדר ובכל מבטא אפשרי. מהר מאוד התרגלנו לתת לה פקודות לכל דבר שמצאנו, טיימרים לבישול, מוסיקה בכל ז׳אנר אפשרי, בירור הזמן המקומי במומבאי ולספר בדיחות. הילדה (שרק התחילה ללמוד אנגלית) נהנית לשחק מולה משחקים ואני חיברנו את מערכת השליטה הביתית כך שהיא מסוגלת להדליק ולכבות אורות. ועם ההצלחה גדל התאבון והתחלנו להוריד ולהשתמש בעוד ועוד כישורים (skills)
רדיו אפשר לשמוע רק דרך האינטרנט. אז מסתבר שאלכסה יודעת להבין מה זה galgalaz ולהזרים את התחנה, אבל תחנות אחרות היא לפעמים מתקשה. כמו למשל 99fm שמשדרת את התוכנית של טל ואביעד שאנחנו נהנים לקשיב לה. האמת שבדרך כלל אנחנו בבעיה כי כשהתוכנית משודרת בבוקר אנחנו או עסוקים בלשלוח את הילדה לבית ספר או אם אפשר, נהנים לישון עד מאוחר. כך שהרבה פעמים אנחנו מפספסים את התוכנית.
למזלינו, התוכניות זמינה להשמעה מהאינטרנט, אבל אף אחד מנגני הפודקאסט שניסיתי על אלכסה לא הכיר את התוכנית, כנראה מכיוון שהקטלוג שלהם פונה לשוק האמריקאי. אז החלטתי להפשיל שרוולים ולכתוב כשרון יעודי לתוכנית.
חיפוש בגוגל הביא מגוון של מדריכים ודוגמאות. בעקרון התהליך פשוט: אלכסה מקליטה את פקודת הדיבור ושולחת אותו לתרגום לטקסט באנגלית. המשפט שפוענח מושווה מול רשימת משפטים (utterances) שמפעילים את הפקודות (intents) האפשריות לכל תוכנה. כאשר משפט כזה מזוהה, הפקודה המתאימה נשלחת לשרת שהוגדר באינטרנט אשר מבצע את הדרוש ומחזיר משפט תשובה שאלכסה מקריאה למשתמש. פשוט, לא ?
בפרקטיקה הדברים הסתבכו די מהר אפילו כשניסיתי לכתוב כשרון hello world בסיסי. על אף שזו לא פעם ראשונה שאני כותב אפליקצית רשת, המעבר לתשתית של אמזון הצריכה הסתגלות. התרגלתי כנראה לתיעוד היסודי של גוגל ונגישות של כל השרותים ממקום אחד. הענן של אמזון לעומת זאת מורכב ממספר כמעט אין סופי של שרותים, שאומנם משתלבים זה בזה, אך כל אחד עומד בפני עצמו. גם התיעוד לא תמיד עדכני ומצריך חיפוש מתמיד של ״איפה זה נמצע עכשיו ??״
ראשית יש צורך בהגדרת חשבון מפתח. אח״כ להכנס לפורטל של אלכסה ולהגדיר כשרון חדש, להכנס לIAM ולהגדיר role להרשאות השימוש, וlambda functions על מנת לכתוב את הקוד עצמו. לא חובה אבל ניתן גם לצרף איכסון קוד בs3 ונתונים בdynamodb. אמנם ניתן להשתמש בכל שרת וובי כדי להגיש את האפליקציה, אך יש צורך להשתמש ב https, מה שפוסל שרתים בייתים, ומצריך פלטפורמה ארוח ״רצינית״. מכיוון שפונקציות למבדה (מערכת PaaS שלהם) הן הפתרון המומלץ על ידי אמזון, רוב הדוגמאות מגיעות ככאלו ולכן בחרתי גם אני בפתרון זה.
במהלך חיפושי אחר דוגמאות מצאתי קוד של אתר artsy שבין השאר משמיע את הפודקאסט שלהם. מחקתי את החלקים שלא רלוונטים והחלפתי את כתובת הrss בכתובת המתאימה. הקוד מבוסס על מודול alexa-app שמפשט מאוד את התהליך. כך למשל ניתן לכתוב תאור כללי ומקוצר של הפקודה הקולית והוא בונה את כל האפשרויות שצריך להכניס בהגדרות הכשרון.
לדוגמה, הפקודה :
"{|to play} {|latest} podcast {|number|episode|episode number} {-|DATE}"
תפורק ל:
PodcastIntent podcast {DATE} PodcastIntent to play podcast {DATE} PodcastIntent latest podcast PodcastIntent to play latest podcast PodcastIntent podcast episode {DATE} PodcastIntent to play podcast episode {DATE} PodcastIntent latest podcast episode PodcastIntent to play latest podcast episode PodcastIntent podcast episode number {DATE} ועוד...
בדיקה בסימולטור הראתה שאני מוצא את התוכנית הנכונה ומחזיר פקודת ניגון עם הכתובת שלה. אבל כשניסיתי את הפקודה על המערכת האמיתית, לא נשמע כלום.
מסתבר שכמו ששרת הכשרון שלנו צריך להיות מוצפן, כך גם פקודות המדיה, אבל השרת של הרדיו שמחזיק את התוכניות עונה רק בפרוטוקול http רגיל. מה עושים ? מצאתי שיש חור קטן בהגנות שאיפשר לי לעבוד. מסתבר שאפשר לשלוח חזרה ״רשימת השמעה״ בפורמט m3u. אבל הקבצים בתוך רשימה זו לא חייבים להיות על שרת מאובטח. אז כתבתי עוד פונקצית למבדה, שעוטפת את שם הקובץ שנרצה להשמיע בקובץ m3u. הפונקציה עובדת בפרוטוקול https המאובטח, כך שאלכסה מקבלת אותו, פותחת אותו ומשמיעה את קובץ הmp3 משרתי הרדיו. הללויה.
זה לקח לי שבוע עבודה והרבה מריטת שיערות, אבל עכשיו אפשר לפתוח את היום במשפט alexa, ask tal and aviad to play latest episode ולהנות.
פשוט. ממש פשוט, כולה שבוע וזהו….
🙂