2013/06/30(日)Raspberry Pi でミクにしゃべらせよう

回路の知識いるのかと思ってスルーしてたけど、最近そうでもないことに気づいて購入しました。買ったのは↓の通り

「Raspberry Pi Type B 512MB」
Raspberry Pi Type B 512MB

「SanDisk サンディスク SDHCカード 16GB(SD 16GB) Extreme HD Video 45MB/秒 並行輸入品 海外パッケージ品」
SanDisk サンディスク SDHCカード 16GB(SD 16GB) Extreme HD Video 45MB/秒  並行輸入品 海外パッケージ品

「iBUFFALO 【iPhone5対応】USB充電器(ACアダプタ) 1ポートタイプ 平型 ブラック BSIPA02BK」
iBUFFALO 【iPhone5対応】USB充電器(ACアダプタ) 1ポートタイプ 平型 ブラック BSIPA02BK

「Amazonベーシック USB2.0ケーブル 1.8m (タイプAオス- マイクロタイプBオス)」
Amazonベーシック USB2.0ケーブル 1.8m (タイプAオス- マイクロタイプBオス)

「PLANEX USB→3.5mmヘッドホン/マイク端子 USBオーディオ変換アダプタ PL-US35AP」
PLANEX USB→3.5mmヘッドホン/マイク端子 USBオーディオ変換アダプタ PL-US35AP

「ELECOM USBハブ USB2.0対応 ACアダプタ付 セルフ・バスパワー両対応 4ポート ホワイト U2H-EG4SWH」
ELECOM USBハブ USB2.0対応 ACアダプタ付 セルフ・バスパワー両対応 4ポート ホワイト U2H-EG4SWH

とりあえず↓のクイックスタートガイド通りやれば動きます。

http://www.raspberrypi.org/quick-start-guide

日本語なら「Raspberry Pi を始める (NOOBSで)」が参考になるかな。

USBオーディオ変換アダプタ「PL-US35AP」の音の出し方は「Raspberry PiとUSBオーディオ」を参考にさせてもらいました。

その後やったことは

  • 「Rsapberry PiのIPアドレスの固定化(ルータの設定)」
  • 「sudo apt-get install ibus-anthy」
  • 「デフォルトのエディタをvimに変更」
  • 「Perlのアップデート(plenvとcpanmのインストール)」
  • 「KyTea(京都テキスト解析ツールキット)のインストール」(読み推定の機能が使えるかな?と思って) とか。

Raspberry PiをしゃべらせるためのOpen JTalkのインストールは「Raspberry Piに喋らせる」を参考にさせてもらいました。

↑では「MMDAgent_Example-1.3.zip」になっていますが、現在では「MMDAgent_Example-1.3.1.zip」が利用可能です。jsayコマンドのシェルスクリプトも公開されているので、TMPのところを「TMP=mktemp -t」に変更して「/usr/local/bin/」に入れときました。(固定のファイル名だとほとんど同時にjsayを実行した場合にまずいことになる)

初音ミクの声のダウンロードは「http://cube370.wiki.fc2.com/wiki/%E8%87%AA%E4%BD%9C%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB」からできます。これをダウンロードして、メイちゃんの声(MMDAgent-Exampleのを解凍したらある)に上書きすれば初音ミクの声がOpen JTalkでも使えます。

何をしゃべらせるかですが、とりあえず現在時刻と天気をしゃべらせるスクリプトを書いて見ました。こういうのがパパっと書けると情報系で良かったと思えますね。

現在時刻をしゃべるスクリプト↓

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw/say/;
use Time::Piece;

my $t = localtime;
my $now = $t->strftime("%p%I時%M分");
$now =~ s/00分//; # ちょうどx時の場合は分を省略する
$now =~ s/12時/零時/;

system("jsay ${now}です");

天気をしゃべるスクリプト↓

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use WebService::Livedoor::Weather;
use Data::Printer;

my $city_id = '170010';

my $lw = WebService::Livedoor::Weather->new;
my $weather = $lw->get($city_id);

#p $weather;

my $talk = "天気概況 $weather->{title}。$weather->{description}{text}。";
$talk =~ s/\n//g; # 改行があると音声がそこで途切れるため

system(qq|jsay "$talk"|);

$talk = "天気予報 "; # 一度に渡しすぎるとセグメンテーション違反になるため

for my $forecast (@{ $weather->{forecasts} })
{
    my $date = $forecast->{date};
    $date =~ s/[0-9]{4}-([0-9]{2})-([0-9]{2})/${1}月${2}日/;
    $date =~ s/0([0-9])/$1/; # 01月 -> 1月

    my $date_label = $forecast->{dateLabel};

    my $telop = $forecast->{telop};
    $telop = 'あさって' if $telop eq '明後日';

    my $kion_max = $forecast->{temperature}{max}{celsius};
    my $kion_min = $forecast->{temperature}{min}{celsius};

    $talk .= "$date_label${date}は${telop}。";
    $talk .= "最高気温は${kion_max}度。" if defined $kion_max;
    $talk .= "最低気温は${kion_min}度。" if defined $kion_min;
}

$talk =~ s/\n/ /g; # 改行があると音声がそこで途切れるため
$talk .= "以上、天気予報をお伝えしました。";

system(qq|jsay "$talk"|);

これらをcronに登録しておくと、時報鳴らしたり、朝食食べながら天気予報聞けたりできます。

GoogleカレンダーとかGmailとかもしゃべらせたいですね。

cronではplenv関連で少しハマったけど、echo $PATHで出てくるのを「PATH=hogehoge」みたいな形でcronの設定ファイルの最上部に書いたら上手く動きました。

ちなみに声は↓のような感じ。

ミクのType-βの声がかわいいですな。

これからRaspberry Piで遊びたい人は「これからRaspberry Piをいじる方向けの資料」という資料がいい感じですかね。