Google TTSを利用してAsteriskで日付・時刻の読み上げ

Google TTSを利用してAsteriskのIVRで日本語読み上げでAsteriskでGoogle TTSに喋らせるというのを書いた。
で、せっかくなのでものすごく簡単な日時読み上げのAGIサンプルを作ってみた。

普通に日時を読み上げるAGI

/usr/local/share/asterisk/agi-bin/speaktime.agi
#!/usr/local/bin/perl

use Asterisk::AGI;
use POSIX qw(mktime);
use lib qw(/usr/local/share/asterisk/agi-bin/);
use MyAsterisk;
use strict;

my $agi = new Asterisk::AGI;
$agi->exec("SayUnixTime", "time(),,bdaHM");
$agi->stream_file('vm-goodbye');
要日本語音声ファイル
入手: http://www.voip-info.jp/index.php/Asterisk_日本語音声 (FreeBSDのportsならjapanese/asterisk-sounds)

Google TTSで日時を読み上げるAGI

/usr/local/share/asterisk/agi-bin/googlettstime.agi
#!/usr/local/bin/perl

use strict;

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
my @dweek = qw/日 月 火 水 木 金 土/;
$mon++;
my $out = "$mon月$mday日$dweek[$wday]曜日$hour時$min分$sec秒です";
print "SET VARIABLE TTSCLOCK $out";

「SET VARIABLE {Asteriskに渡す戻り値の変数名} 戻り値」これを表示するスクリプトを作ればAsteriskのダイヤルプランに渡すことができる。
普通に実行すれば「SET VARIABLE TTSCLOCK 6月28日水曜日19時58分20秒」のような文字列が表示される筈。

ダイヤルプラン

/usr/local/etc/asterisk/extensions.conf (の一部)
[general]
writeprotect=no
priorityjumping=no

[globals]
SPEAKINGCLOCK=317
GOOGLETTSCLOCK=318

[default]
;=== 日時読み上げ (普通) ===
exten => ${SPEAKINGCLOCK},1,Goto(speakclock,s,1)

;=== 日時読み上げ (Google TTS) ===
exten => ${GOOGLETTSCLOCK},1,Goto(googlettsclock,s,1)

[speakclock]
;=== 日時読み上げ (普通) ===
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,AGI(speaktime.agi)
exten => s,n,Wait(1)
exten => s,n,Hangup()

[googlettsclock]
;=== 日時読み上げ (Google TTS) ===
exten => s,1,Answer()
exten => s,n,agi(googlettstime.agi)
exten => s,n,agi(googletts.agi,"${TTSCLOCK}",ja)
exten => s,n,Wait(1)
exten => s,n,Hangup()

defaultコンテクストからフローに入るとする。
317に発信すると普通の時刻読み上げを行って切断。
318に発信するとGoogleTTSを使った日時読み上げ。
27行目のgooglettstime.agi実行で現在の日時を作成、28行目でそれを喋らせる。その後通話切断。

読み上げサンプル

普通に日時を読み上げ

細切れの部品を繋いで読むのでぎこちない(けど各部品は人間の声なので綺麗)。

GoogleTTSで日時読み上げ

なめらかに読み上げるけど合成の声っぽさは多少。

どちらも実際に通話したものをスマートフォンの通話録音機能を使用して録音している。雑音もあるがご容赦。

関連記事:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です