🤖

IoTデバイスの機能テストに音声合成を使った話

2022/12/14に公開

※この記事はLuup Advent Calendarの14日目の記事です。

本記事では、IoTデバイスの機能テストに音声合成 (TTS: Text-to-Speech) を用いた事例をご紹介します。

IoTデバイス周りは結構複雑にできている

LUUPの車両に搭載されているIoTデバイスは、内蔵の通信モジュールを介して車両の動作状況をサーバへ送信しています。サービス品質向上の取り組みとして、これらの情報はオペレーションの効率化や車両の故障検知、予防保全などに活用されています。

このIoTデバイスには、電子錠やディスプレイ装置、駆動系を制御するECUなど様々な周辺機器が接続されています。それらは個別のファームウェアで動作しているため、ファームウェアの更新が一定の頻度で発生します。

「念には念を」の機能テスト

周辺機器とIoTデバイスは複雑に連携しているため、周辺機器のファームウェア更新によって、全体の通信機能が思わぬ影響を受けてしまう、という事態は回避したいところです。

そこで我々はファームウェアのテストとは別に、IoTデバイス<->サーバ間の通信のテストを行うことにしました。このテストは通信機能に主眼を置いたものですが、IoTチーム内では単に機能テストと呼ばれています。

このテストでは、全ての種類の通信を網羅する必要があったので、多くのテスト項目を効率よく実施できるように、TypeScriptで専用のツールを作成しました。

ハードウェアと連携するテスト

テストを完全に自動化できたら理想的なのですが、通信の中には「物理ロックの施錠」「バッテリーの着脱」「車両を揺らす」など、車両の物理的な操作が必要なものもあります。一人で車両を操作しながらコンソールを叩いていては効率が悪いので、テスト実行役と車両操作役の二人で取り掛かるのが良さそうです。だいたい次のようなイメージです。

テスト実行役 「テストA-11を実行します。合図で施錠してください。3,2,1,ハイ!」
車両操作役  「施錠しました!」
テスト実行役 「OKです!」

しかし残念ながら、私は一人で作業していたのでした。そこで、テスト実行役のセリフをテストスクリプトに喋らせて、車両の操作は自分で行うことにしました。自分の書いたプログラムに指図されると複雑な感情が湧いてきますが、テストは効率よく進められるようになりました。

sayコマンドを試してみる

macOSにはテキストを読み上げるためのsayコマンドがあります。以下のコマンドを実行するとテキストが読み上げられます。

$ say 'こんにちは'

sayコマンドはOSのTTS機能のインターフェースとして動作するため、デフォルトの声の種類はOSの設定が反映されるようです。声の種類はコマンドの-vオプションで指定します。これらは声色だけでなく流暢性にも違いがあり、英語だとAlexやSamanthaなどが聞き取りやすいようです。声の一覧はsay -v '?'で確認できます。

$ say -v Samantha 'I am the one who knocks'

たとえば、時間のかかるコマンドの完了を音声で知らせてほしいときには、こんな使い方もあります。

$ time sleep 3; say -v Samantha 'done'

カウントダウンを試してみましょう。[[slnc 1000]]で1秒間の空白を指定します。

$ say -v Samantha '3 [[slnc 1000]] 2 [[slnc 1000]] 1 [[slnc 1000]] start'

しかし、読み上げの間に1秒間の空白を入れただけでは、秒刻みのカウントダウンになりません。そんな細かいことを気にするのはどうかと思いますが、私は気になるのでした。

npmライブラリのsay.jsを使えば、node.jsからsayコマンドを扱うことができます。このライブラリは使用するTTSエンジンをOSごとに切り替えてくれるので、WindowsやLinuxでも動作するようです。ただし、指定できる声の種類はOSごとに異なります。以下のコードは、秒刻みのカウントダウンの例です。

countdown.ts
import say from 'say'
;(async () => {
  for await (const s of '3 2 1 start'.split(' ')) {
    say.speak(s, 'Samantha')
    await new Promise(resolve => setTimeout(resolve, 1000))
  }
})()

この他にも、音量や速度、ピッチを指定するオプションがあります。Web上のコンテンツを読み上げさせるのも面白そうですね。読み上げの音声データをファイルへ書き出すことも可能ですが、ファイル出力した音声を利用する際はライセンス上の制限にご注意ください。

sayコマンドの音声を追加する

macOSではシステム設定からTTSの音声を追加できます。様々な言語の音声が用意されていますが、中でも英語(アメリカ合衆国) ― その他のカテゴリの音声が個性的すぎるのでオススメです。音声を追加すると、say -v '?'の一覧も変化します。

macos_setting
「システムの声」のプルダウンリストから「カスタマイズ」を選択

以下のコマンドでen_USカテゴリの音声サンプルを連続して視聴できます。sayコマンドに-iオプションを指定してinteractiveモードで動作させているので、再生中の単語がハイライトされます。

$ say -v '?' | grep US | perl -ne 's/((\w+).*)# (.*)/$2 $3/; print "echo $1;say -i -v $2 \"$3\"\n"' | sh

interactiveモードの動作の様子
interactiveモードの動作の様子

おわりに

いろいろな音声を視聴してみると、明らかなロボット声よりも、人間のイントネーションに近い声のほうが「なんか違和感あるなー」と感じることがあります。いわゆる「不気味の谷」と関係しているのかもしれません。

そして私は、英語圏の音声に無理やり日本語を喋らせるのにハマっています。
(例:say -v Whisper 'kon ni chi wa'

Luup Developers Blog

Discussion