Azure+Cognitive Servicesで英語の発音を練習するWebサービスを作った

はじめに

今年から Azure により深く関わることになった。
手始めに Cognitive Services の SpeechAPI でちょっとしたWebサービスをつくった。

kheiakiyama.github.io


PCで動作確認済み。
iPhone のMobileSafariではHTML5の音声入力が動かないので動作しない。


www.microsoft.com

システム構成

趣味のサービスなのでコストがかからないように、いわゆるサーバーレスな構成。

  • フロントは GitHub Pages で静的サイトホスティング
  • バックエンドは Azure Function
  • 英語の文章はスクレイピングして結果を TableStorage に保存
    同時に QueueStorage にも登録
  • Azure Function で Queue をトリガーに Cognitive Services の Text to Speech で音声化し、BlobStorage に保存

Azure について

Cognitive Services

サイトで試しに聴いてみればわかるとおり、Text to Speech で出力した音声は自然に聴き取れる。


一方、Speech Recognition は全然自分の英語を認識してくれないので評価しづらい。
英語が堪能な人に試してもらうと認識されるので、練習あるのみ。


Speech API が $4 per 1000 calls なので、API を軸にしたサービスでペイするのはなかなか厳しそう。
あくまでも既存のサービスの満足度を高めるために利用するのがベターそう。

Azure Function

全体的にすごくよい。
Function ごとにディレクトリ切って実装するだけなので簡単。


大半が WebApps と同じ感覚で使えるので学習コストが低くて済む。
単純に REST API を簡単に作れるだけではなく、Storage をはじめとした Azure のサービスとの連携が気持ちよくできる。
たとえば Queue と Table を入力に Blob へ出力するための設定は以下のような感じ。

{
  "bindings": [
    {
      "name" : "queueItem",
      "queueName" : "speech",
      "connection" : "{queue_accesskey}",
      "type" : "queueTrigger",
      "direction" : "in"
    },
    {
      "name": "entity",
      "type": "table",
      "direction": "in",
      "tableName": "sentences",
      "partitionKey": "speech-eng",
      "rowKey": "{queueTrigger}",
      "connection": "{table_accesskey}"
    },
    {
      "name": "outBlob",
      "type": "blob",
      "direction": "out",
      "path": "speechs/{queueTrigger}.wav",
      "connection": "{blob_accesskey}"
    }
  ],
  "disabled": false
}

name に指定した名前が実装する function のパラメータ名になる。

public static async Task Run(
    string queueItem, //in queue の binding
    TableEntity entity, //in table の binding
    Stream outBlob, //out blob の binding
    TraceWriter log)
{
    //do something...
}

公式ドキュメントでは functions-triggers-bindings のあたりを読むといろんなパターンが載っている。

おそらく厳しいが、DataFactory のように今後他のパブリッククラウドとも連携されたらいいなと夢が広がる。


悪い部分をあげるとささいなレベル。
ポータル上のエディタが不便(ローカルで書けばいい)とか、下に書いたハマりポイントがあった程度。

AzureFunctions で開発するときにハマったこと - Qiita

あとがき

サービス自体について思ってること

  • もうちょっと練習に適した文章使いたい。けど本などの教材からパクるわけにもいかないので悩む。
    サイトに載せていいようなまとまった資料あったらぜひ教えてください
  • 日本語訳くらいは表示しておきたい。
  • 正答の精度もうちょっとゆるくしたい。もしくは精度自体表示する。
  • 正答率表示は回答者いないとワークしないから後で実装すべきだった。
  • というかスクレイピングによって出題が増え続けるのはよくない気がする

と書いてみたものの、こうしてブログ書くとあまりいじらなくなるのでやる保証はない。

英会話・ぜったい・音読 【続・入門編】 (CDブック)

英会話・ぜったい・音読 【続・入門編】 (CDブック)