漫画やドラマで題材として取り上げられ、百人一首がブームになっています。そこで、今回は、Webブラウザの音声合成APIを利用して、百人一首をランダムに読み上げるアプリを作ってみましょう。
音声合成APIが面白い
ちょうど、前回、音声合成APIを使ったプログラムの作り方を紹介しました。前回、音声合成APIを紹介したところ仲間内で大好評でした。基本的に『「何々」と話す』と書くだけなので、使い方も簡単です。ちょっと復習してみましょう。
なでしこ3簡易エディタを開いて、そこに、以下のように記述して「実行」ボタンを押すだけです。
3回、「東京 特許 許可局」と話す。
すると、人間だとうまく読めない早口言葉を正確に読み上げます。
※もし、うまく音声が読み上げされない場合は、最新のブラウザにアップデートしてみてください。 主要PC向けブラウザであれば、音声合成APIに対応しています。ただし、Windows環境では、Microsoft Speech API(SAPI)のインストールが必要な場合があります。
百人一首のデータはどこから?
そして、次に、百人一首のデータをどこから持ってくるのかを考えましょう。百もある札を全て手入力するのは大変です。そんな時は、Webを検索してみましょう。すると、百人一首のデータを取得できる「百人一首API」を見つけることができます。実はこのAPIは、筆者が何年も前に作ったサービスです。これを使えば、手軽に、百人一首のデータを利用できます。
APIの使い方ですが、指定のURLにアクセスするだけです。なでしこからアクセスするには、以下のように記述します。以下は、APIにアクセスし、百人一首の全データを表示する例です。
API=「https://api.aoikujira.com/hyakunin/get2.php?fmt=json」
APIへGET送信した時には
対象をJSONデコードして百人一首に代入。
百人一首を反復
対象["kami"]&対象["simo"]を表示。
ここまで。
ここまで。
実行ボタンを押すと、以下のように百首が全部表示されます。
なお、どんなデータが取得できるかですが、次のデータを取得できます。
JSONのキー | 内容 |
---|---|
kami | 上の句 |
simo | 下の句 |
kami_kana | 上の句のよみがな |
simo_kana | 下の句のよみがな |
sakusya | 作者 |
sakusya_kana | 作者のよみがな |
image | 絵札の画像URL |
百人一首読み上げプログラム
ここまで分かれば、あとはコツコツ作っていくだけです。百人一首をランダムにシャッフルして、一つずつ読み上げる処理を作りましょう。
それでは、以下に完成したプログラムを紹介します。同じように、なでしこ3簡易エディタに書き込んで実行してみてください。
# 変数の初期化 --- (*1)
残句 = []
API=「https://api.aoikujira.com/hyakunin/get2.php?fmt=json」
{"速度":0.5}に話者詳細設定。
# 百人一首のデータを取得 --- (*2)
APIにGET送信した時には
対象をJSONデコードして、配列シャッフルして、残句に代入。
読上実行。
ここまで
# 一句ずつ読み上げを実行する関数を定義 --- (*3)
●読上実行とは
残数=残句の要素数。
もし、残数=0ならば
「終わりです。」と話して、戻る。
ここまで
# 一つだけ配列から取り出す --- (*4)
今句=残句から配列ポップ。
上句=今句["kami_kana"]
下句=今句["simo_kana"]
内容=上句&" "&下句。
内容の「 」を「、」に置換して内容に代入。
今句["no"]&":"&今句["kami"]&" "&今句["simo"]を表示。
# 話し終わった時に次の句を詠むように設定 --- (*5)
内容を話し終わった時には
「読上実行」を2秒後。
ここまで
ここまで
上記のプログラムを、なでしこ3簡易エディタに貼り付けて実行すると、2秒ごとに百人一首の読み上げを行います。
それでは、百人一首の読み上げプログラムを詳しく見ていきましょう。プログラムの(*1)の部分では変数を初期化します。変数「残句」というのは、配列変数で、読み上げるべき句の一覧を保持します。また、四行目では、読み上げ速度を指定します。速度に指定する値ですが、0.5でゆっくり、1.0で普通の人間の話す感じです。数値を大きくすると、話す速度があがります。そして、プログラム(*2)の部分では、百人一首のデータをAPIから取得したら、配列をシャッフルしてゲームを開始します。
プログラムの(*3)の部分では、百人一首の読み上げを開始します。配列変数「残句」に残りの百人一首データが入っています。もし、この変数が空ならば、読み上げを終了します。
次に、(*4)の部分では、変数「残句」から一つ句を取り出して読み上げます。この時、百人一首のデータに含まれるかなデータ(kami_kanaとsimo_kana)を用いて読み上げます。上の句と下の句を、そのまま読み上げさせたところ、かなりの頻度で読み間違いをしていました。そこで、かなを用いて句を読み上げるようにしました。そのせいで、ちょっと読み上げが不自然な感じになってしまうのですが。
(*5)の部分では、読み上げを行い、読み上げが終了し、2秒後に、関数「読上実行」を再度実行するようにします。このように、再帰的に自身を呼び出すように指定することで、百人一首のデータを残らず読み上げることができます。
まとめ
以上、今回は百人一首の読み上げを行うプログラムを作ってみました。音声合成APIの可能性を感じることのできるプログラムになりました。音声の読み上げは、人間のように感情をこめて読むことはできませんが、SFに出てくるロボットよりはずっと自然に発話しているように感じました。
なお、筆者は、Windows/macOSの両方で試してみました。OSによって読み上げ方はずいぶん異なるものの、いずれも意味が分からないほどではありません。また、百人一首の読み上げのように、人間がやると大変時間のかかる事も、文句の一つも言わずにやり遂げてくれるのが良い点です。それでは、皆さんも、音声合成APIを使って、便利で面白いプログラムを作ってみてください。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。