AllIsHackedOff

Just a memo, just a progress

スマートスピーカーに青空文庫を朗読させるためにATOMのプラグインを作っている話

こんばんは。この記事はGunosy Advent Calendar 2017 - Qiitaの12/22の記事です。 前日の記事はGoogle Home と Android ThingsでLチカする - CrossBridge Labでした。 本末転倒?感のあるタイトルをつけてしまいましたが、 今回はGoogle HomeやらAmazon Echoに青空文庫を朗読させるために余暇で行っている下準備について記載します。

僕の頭のなかではAmazon Echoに青空文庫を朗読しながら眠りにつく毎日を送っているはずだったのですが。 Amazon Echo ... 申込んだのになかなか売ってもらえない....つらい。 実機がない状態でLambdaやPollyを触りつつ、所持しているGoogle Homeで粛々と準備をすすめている次第です。

目次

  • SSML(Speech Synthesis Markup Language)について
  • Amazon Polly
  • SSMLを気軽に作りたい -> Atomプラグイン作成

SSML(Speech Synthesis Markup Language)について

SSMLはSpeech Synthesis Markup Languageの略称です。その名の通り、音声合成マークアップするための言語で、仕様はSpeech Synthesis Markup Language (SSML) Version 1.1に記載されています。 SSMLを記述することにより会話中の

  • 休止(break / 秒数)
  • 強調(emphasis)
  • 声量/ピッチ/強弱/速さ (prosody)

をコントロールすることができます。

Alexaで利用できるタグに関しては下記の公式ドキュメントに非常に丁寧に記載されており、日本語の発話例も提示されています。 Speech Synthesis Markup Language (SSML) Reference | Custom Skills Speechcon Reference (Interjections): Japanese | Custom Skills

12/20に公開された下記の記事に具体例と共にGoogle Assistantの設定まで詳しく書かれており、非常に勉強になりました。 qiita.com

Amazon Polly

Amazon PollyはText-to-Speech用の音声を合成してくれるクラウドサービスです。 https://aws.amazon.com/jp/blogs/news/polly-text-to-speech-in-47-voices-and-24-languages/ AWS Consoleから気軽に試すことができ、無料利用枠も存在しています。

試しに青空文庫から宮沢賢治 狼森と笊森、盗森を取得してGUI上にコピペしてみると f:id:masashisalvador:20171222191624p:plain こんな感じになります。 soundcloud.com 青空文庫の文章を色々投げ込んでみて感じた所感としては、意外と発音は正しい、人名やコンテキストによって読みが変わる文字、ルビがないと人間にも読めないものはやはりうまく発音されません。 (上記の例だと、巨い(おおきい)など) そして何より、素の発音だと抑揚がないため、ぶっちゃけるとあまり面白くありません。

いい朗読をさせるためにはSSMLをうまく書いてやらないといけない。 ということになります。

しかしSSMLはただのXMLです。素のXMLを淡々と打ち込んでいくだけの精神力を、僕は持ち合わせていませんでした。

SSMLを気軽に作りたい -> Atomプラグイン作成

若干調べた感じ、フリーでいい感じにSSMLを編集させてくれるソフトは見当たらないようでした。 SSMLをもっと気軽にかけないと楽しい朗読までたどり着かない...ということで簡単なエディタを作ることにしました。

やりたいことはシンプル。タグを簡単に挿入していきたいのです。 また、使い方が簡単で、プログラマーでなくとも朗読用のSSMLを作れるようにしたい。

ということで、雑ですがイメージとしてはこんな感じです。 f:id:masashisalvador:20171222193402j:plain

しかしエディタを0から作るのはハードルが高い...ということで出来合いのものに乗っかることにします。 業務ではすっかりIntelliJの奴隷と化しているのですが、ここは一つATOM様に助けを求めたいとおもいます。

ATOMプラグイン作成自体は公式ドキュメント atom.io と幾つかの記事を参考にすると簡単に作ることができました。

以下、機能と書いたコードを少しだけ紹介します。

1. 休止の挿入

https://gyazo.com/7c4c3a8a92d6469b964be768d49adfd9

秒数を選択しておけば休止秒数が指定できるように、下記のようなコードを書いています。

  insertBreak() {
    let editor = atom.workspace.getActiveTextEditor();
    // 選択部分の取得
    let selectedText = editor.getSelectedText();
    var breakTag = "";

    if (selectedText.length <= 0) {
      breakTag = '<break strength="strong"/>';
    } else {
      breakTag = '<break time="' + selectedText + 's"/>'
    }

    editor.insertText(breakTag);
  },

2.強調の挿入

選択部分を強調します。選択部の冒頭にsr を付しておくと、強調タグ(emphasisタグ)のlevelが strongreduced になるようにしています。

https://gyazo.com/ad605e72ae354c9f5f7d41d32821452a

  insertEmphasis() {
    let editor = atom.workspace.getActiveTextEditor();
    let selectedText = editor.getSelectedText();
    if (selectedText.length <= 0) {
      return;
    }
  // 中略

    let tag = this.wrapTextWithEmphasisTagWithLevel(selectedText, level);
    editor.insertText(tag);
  },

まとめ

アドベントカレンダーまでには作り終わる!と意気込んでいたのですが、やっていくと色々と考慮しなければならない点が出てきたので未完の状態です。SSMLの各タグで指定できる属性が色々とあるので、属性をどうやってスムースに入力させるか...などを考えているとキリがなくなってきました。

ひとまず自分でひたすら使ってみて、駄目でも先に進むスタイルで年明けあたりに公開したいなと思っています。

それでは皆さんよいクリスマスを!