Alexa!次の電車は? 11月25日, 2020


1 <speak><say-as interpret-as="time">2分??秒</say-as></speak>
2 <speak><say-as interpret-as="time">0 分??秒</say-as></speak>

このところAlexa-Skillで遊んでいる。最寄り駅の次の電車の発車時刻を応えるスキルを登録したのだけど,困ったことが2つ。

時刻表データを配列に用意して,近い時間の発車時刻を応えるだけの単純なpythonスクリプト。スピーチのタイプを"PlainText"にしたのだけど,これでは,"2分,5分,9分"のような1桁の時刻(分)を「にぶ,ごぶ,きゅうぶ」と読んでしまう。次の電車の発車時刻自体はまあわかるのだけど,ちょっと無念。修正には改めてawsの豊富な説明書きを読まねばならなかった。でも読めば収穫あり。"SSML"についてまとめられているのを読んで報われた。これで解決できた。"SSML"とは,"Speech Synthesis Markup Language"で,読み上げの細かな部分を調整する方法のようだ。その"<say-as>"に"time"というオプションがあり,これでOK。

<speak>次の電車は<say-as interpret-as="time">2分??秒</say-as>です</speak>
これで「次の電車はニフンです」と読まれる。"??秒"は読まれない。読まれないが,"time"のフォーマットの関係からだろう,秒の指定が欠かせない。

<speak>次の電車は<say-as interpret-as="time">0 分??秒</say-as>です</speak>
次に困ったのは,「レイフン」。時刻にあるのを「レイフン」と読んで欲しいがそのように読まれず,ただ「レイ」だけで終ってしまう。この挙動の理由は推測できるが,これは乗り越えるには相当難しい壁だった。何の掴み所もない。詳細な筈の説明書きにも触れられていない。Amazonだけではたりず,Microsoft・Googleその他にかなりの文書がある。"<say-as>"の源流の一つらしき"W3C"まで辿ってしまったが何も行き当たらず。こんな時はUSAの質問サイトをあさればヒントに行き当たるのが普通だけど,全くダメ。もう「試行錯誤」しかない。それで発見したのが,上記方法。わかりにくいかもしれないが,ゼロの後ろにスペースを挿入する方法だ。読み上げる文を変数で用意しているのだけど,"0分"にはこの処理を加える。これで期待通りに読まれる。

「Alexa,○○駅の次の電車は?」のように聞くと,「今日は休日なので,次の電車は○○です」のように応えてくれる。結構楽しめる。休日判断は「jpholydayモジュール」を組み込んでいる。