本botでは毎時0分、10分、20分、30分、40分、50分に、かつて短波JJYで毎時9分、19分、29分、39分、49分、59分に送出されていた認識信号を再現した音声を含む映像を投稿しています。

必要とする映像数は、24時間×毎時6回=144本となります。

これだけの映像を手作業で用意するとなると途方もない時間がかかることから、144回実行しなければならない部分はコマンド実行することを前提に映像制作を行いました。

  • 映像画面サイズ:1280ピクセル×720ピクセル(アスペクト比16:9)
  • フレームレート:29.97fps
  • 音声チャンネル数:2(モノステレオ)
  • 音声サンプルレート:48kHz
  • 音声収録内容:かつて短波JJYで毎時9分、19分、29分、39分、49分、59分に送出されていた認識信号を再現した音声。分秒信号は入っていません。
    1. モールス信号によるコールサイン「JJY」2回
    2. モールス信号による時刻(時2桁、分2桁)1回
    3. 日本語アナウンスによるコールサイン「JJY」2回
    4. 日本語アナウンスによる時刻1回
    5. 日本語アナウンスによる「JST」1回
    6. モールス信号による電波警報符号5回(本botでは、N(安定)固定としています)

音声は「モールス信号部」と「アナウンス部」に分けて生成しました。このうち、「モールス信号部」は「アナウンス部」を挟んで前半の「コールサイン&時刻モールス部」と「電波警報符号部」に分けて生成しました。

  1. コールサイン&時刻モールス部:モールス信号によるコールサイン「JJY」2回&モールス信号による時刻(時2桁、分2桁)1回
  2. アナウンス部:日本語アナウンスによるコールサイン「JJY」2回&日本語アナウンスによる時刻1回&日本語アナウンスによる「JST」1回
  3. 電波警報符号部:モールス信号による電波警報符号5回(本botでは、N(安定)固定としています)

モールス信号部の生成

モールス信号部の生成には、「cwwav」を用いました。
参考資料:テキストからモールス信号のwavファイルを生成する『cwwav』コマンド | 俺的備忘録 〜なんかいろいろ〜

設定は次の通りとしました。

  • 信号周波数:1000Hz
  • サンプルレート:16000Hz
  • WPM(Words per minute):20WPM

コールサイン&時刻モールス部は次のコマンドで生成しました。例として「10時20分」の場合を示します。

echo "JJY JJY 1020" | cwwav --output cw/1020.wav --frequency=1000 --rate=16000 --wpm=20

電波警報符号部は次のコマンドで生成しました。

echo "N N N N N" | cwwav --output cw/N.wav --frequency=1000 --rate=16000 --wpm=20

アナウンス部の生成

アナウンス音源は国立研究開発法人情報通信研究機構(NICT)資料室 短波標準電波(JJY)時報音声ライブラリ で公開していますが、「本ライブラリのご利用は、個人での利用に限らせて頂きます」「本ライブラリの再配布を禁止します」とあるため、本botでの使用は断念しました。

そのため、こちらで合成音声を用いて生成しました。

使用したのは下記のソフトウェアやライブラリです。

  • Open JTalk:音声合成システム
  • MMDAgent:音声対話システム構築ツールキット
    本botでは、サンプルとして提供されている名古屋工業大学のマスコット「メイ」の音声データを使用しています。

アナウンス部は「JJY」「時刻」「JST」の3つに分けて生成しました。日本語部分と英語部分で速度を変えています。

「JJY」部は次のコマンドで生成しました。

echo "JJY" | open_jtalk -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.11 -m /usr/local/share/hts_voice/mei/mei_normal.htsvoice -ow announce/JJY.wav -r 0.6 -a 0.55


HTS Voice "Mei (Normal)" Copyright (c) 2009-2012 Nagoya Institute of Technology

時刻部は次のコマンドで生成しました。例として「10時20分」の場合を示します。

echo "10時 20分" | open_jtalk -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.11 -m /usr/local/share/hts_voice/mei/mei_normal.htsvoice -ow announce/1020.wav -r 0.900000 -a 0.550000


HTS Voice "Mei (Normal)" Copyright (c) 2009-2012 Nagoya Institute of Technology

「0分」の場合

この音声合成システムは、「0分」を渡すと「ゼロ分」と読んでしまいます。

echo "0分" | open_jtalk -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.11 -m /usr/local/share/hts_voice/mei/mei_normal.htsvoice -ow announce/zero.wav -r 0.900000 -a 0.550000


HTS Voice "Mei (Normal)" Copyright (c) 2009-2012 Nagoya Institute of Technology

しかし、実際のアナウンスは「れい分」と読んでいます。

「零分」を渡すと正しく「れい分」と読んでくれます。

echo "零分" | open_jtalk -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.11 -m /usr/local/share/hts_voice/mei/mei_normal.htsvoice -ow announce/rei.wav -r 0.900000 -a 0.550000


HTS Voice "Mei (Normal)" Copyright (c) 2009-2012 Nagoya Institute of Technology

「JST」部は次のコマンドで生成しました。

echo "JST" | open_jtalk -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.11 -m /usr/local/share/hts_voice/mei/mei_normal.htsvoice -ow announce/JST.wav -r 0.6 -a 0.55


HTS Voice "Mei (Normal)" Copyright (c) 2009-2012 Nagoya Institute of Technology

音声の結合

ここまでで、次のファイル群ができあがりました。
※「xxxx」は時分4桁(10時20分=1020)

  1. コールサイン&時刻モールス部(cw/xxxx.wav)
  2. 「JJY」アナウンス(announce/JJY.wav)
  3. 時分アナウンス(announce/xxxx.wav)
  4. 「JST」アナウンス(announce/JST.wav)
  5. 電波警報符号部(cw/N.wav)

これらのファイルを「FFmpeg」で結合します。コマンドは10時20分を例にしています。

ffmpeg -i cw/1020.wav -i announce/JJY.wav -i announce/JJY.wav -i announce/1020.wav -i announce/JST.wav -i cw/N.wav -filter_complex "concat=n=6:v=0:a=1" complete/1020.wav


HTS Voice "Mei (Normal)" Copyright (c) 2009-2012 Nagoya Institute of Technology

映像側は、単に時刻を載せるだけの仕様としました。ただこちらも144枚制作する必要があったため、時刻を載せるのはコマンドで行いました。

まずはペイントで、ベースとなる画像を用意します。

次に、「ImageMagick」で時刻を載せます。例として10時20分の場合:

convert -font IPAGothic -pointsize 200 -gravity center -fill white -annotate 0 "10:20" image/base.png image/1020.png

時刻部分で使用したフォントは「IPAフォント」です。

ここまでで、次のファイル群ができあがりました。
※「xxxx」は時分4桁(10時20分=1020)

  1. 音声ファイル(complete/xxxx.wav)
  2. 画像ファイル(image/xxxx.png)

これらのファイルを「FFmpeg」で結合します。コマンドは10時20分を例にしています。

ffmpeg -loop 1 -r 30000/1001 -i image/1020.png -i complete/1020.wav -vcodec libx264 -acodec aac -strict experimental -ab 320k -ac 2 -ar 48000 -pix_fmt yuv420p -shortest video/1020.mp4

完成した映像はこちらです。