ちょっと話題の記事

[日本語Alexa] Alexaで実際に読ませて確認しながら編集できるSSMLエディタを作ってみました

今回は、Alexaで読ませるテキストを編集するアプリを考えてみました。コンテンツの更新が頻繁に発生するような現場では、重宝されるのでは無いでしょうか・・・・
2018.04.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

フラッシュブリーフィングでは、既存のRSSフィールドを、簡単にAlexaに読ませることができます。また、何らかのコンテンツが既にある場合、「これをそのままAlexaに読ませるだけ!」というような考えは、きっとあるでしょう。

しかし、実際にやってみると、実は、そんなに簡単では無いことに気が付きます。専門用語などが、うまく読めなかったり、文章の区切りが不十分で、「ちょっと聞き心地が良くない」みたいな状況が発生するのです。

そこで、実際にAlexaに発話させてみて、文章の区切り部分にbreakタグを入れてみたり、読み方が間違って居る部分をひらがなに置き換えたりする作業が必要になってくるのです。しかし、やってみると分かりますが、これは、思いの外、手間のかかる作業となります。一度作業して、そのまま繰り返し利用するのであれば、許容できますが、毎日更新されるコンテンツとなるとそうも行きません。

今回は、このような作業を支援するプログラムの一例としてSSMLエディタを雑に作ってみました。

作成した、SSMLエディタでは、編集中のテキストをS3に保存し、専用のスキルが、その内容をSSMLのデータとして扱い発話します。

動作している様子です。プログラムは、Windowsで動作しています。

2 SSMLエディタ

(1) エディタ

SSMLエディタのメインの画面は、単純なエディタです。普通にコピー&ペーストでテキストを貼り付けたり、編集することができます。

(2) 編集

編集中に、右クリックのコンテキストメニューから、SSMLの挿入などが可能です。

下記では、500msの休止(BREAKタグ)をカーソル位置に追加しています。

private void PopupMenuBreak500_Click(object sender, EventArgs e) {
    InsertText("<break time=\"500ms\"/>");

}

private void InsertText(string text) {
    if (textBox.SelectedText.Length == 0) {
        textBox.SelectedText = text;
    }
    textBox.Focus();
    textBox.SelectionLength = 0;
    textBox.SelectionStart = textBox.Text.Length;
}

(3) 置き換え

2つめのタブ「Replace」に登録しておくことで、専門用語などを一気に「ひらがな・カタカナ」に変換できます。繰り返し行う変換は、ここに登録しておくことで、次回から自動的に変換されます。

(4) S3への保存

メニューから Tool > Send Alexa (F2)で、編集中のテキストをS3のバケットに送ります。

private void MainMenuSendAlexa_Click(object sender, EventArgs e) {
    sendText(textBox.Text);
}

private void sendText(string text) {

    var accessKey = "XXXXXXXXXXXXXXXXXX";
    var secretKey = "XXXXXXXXXXXXXXXXXX";

    var credentials = new BasicAWSCredentials(accessKey, secretKey);
    var config = new AmazonS3Config();
    config.ServiceURL = "s3.amazonaws.com";
    config.RegionEndpoint = Amazon.RegionEndpoint.GetBySystemName("us-east-1");
    var client = new AmazonS3Client(credentials, config);

    var bucketName = "ssml-editor";
    var keyName = "ssml.txt";

    try {
        var request = new PutObjectRequest() {
            ContentBody = text,
            BucketName = bucketName,
            Key = keyName
        };
        client.PutObject(request); 

    } catch (AmazonS3Exception amazonS3Exception) {
        Console.WriteLine("An error occurred with the message '{0}' when writing an object", amazonS3Exception.Message);
    }
}

(5) 一部再生

テキストの一部を選択して、そこだけAlexaで再生することも可能です。長い文章を修正していく中では、一部を編集しながら繰り返し再生を確かめたくなるニーズは、きっとあると思います。

3 S3

S3側は、特に何もありません。専用のBucketを一つ作成しているだけです。

4 Lambda

Lambda側の実装は、極めてシンプルです。起動時にS3のテキストを取得して :tell で読ませているだけです。

const handlers = {
  'ReadIntent': async function () {
    const aws = new AWS();
    const bucket = 'ssml-editor';
    const key = 'ssml.txt';
    try {
      const data = await aws.s3_get(bucket, key);
      this.emit(':tell', data.Body.toString());
    } catch (err) {
      console.log('ERROR: Failed to acquire from S3.' + err)
    }
  },
  'Unhandled': function () {
    this.emit('ReadIntent');
  },

5 最後に

今回は、Alexaで読ませるテキストを編集するアプリを考えてみました。コンテンツの更新が頻繁に発生するような現場では、重宝されるのでは無いでしょうか・・・・