ラズパイ3倍美味しいブログ

ラズパイ3を美味しく食べるはずがinto the VR!!!

音声認識&音声応答ミュージックプレーヤー その2

 前回のラズピッピ音声認識&音声応答ミュージックプレーヤーの続き。さらに音楽を充実させてみた実験。

umesyurock0603.hatenablog.com


(1)WindowsPCに保存しているiTunes内の音楽をmp3に変換する。WAVで取り込んでてもMP3に変換できんだってね。知らなかった、助かった。

digitalfan.jp

(2)mp3データをWinSCPを使って、ラズパイではSSH接続を有効にしておいて、指定のフォルダに移動させる。(WindowsPCの中のファイルを、ラズベリーパイの中身を覗き見ながらここのフォルダに移動しよーってことができる。とっても便利。)

www.kibanhonpo.com


(3)作っていたword.yomiファイルに新しく単語を追加、さらにjuliusが認識可能な単語辞書ファイル(word.dic)へ変換。
(4)/home/pi/julius-4.3.1/jclient-perlのフォルダに作っていたjclient_music.plのファイルをテキストエディタで開いて、こっちもいじる。
(5)LXTerminalで
$ julius -C ~/julius-kits/dictation-kit-v4.3.1-linux/word.jconf -module
続いて、LX Terminalで別のタブを開いて下記を打ち込んでエンター
$ perl ~/julius-4.3.1/jclient-perl/jclient_music.pl
これで私の思った通りの曲を再生してくれるミュージックプレーヤーができるはず!

(1)(2)は参考サイトを参考にして、ラズパイの中にmp3をじゃんじゃん入れます。(mp3のファイル名は後ほど変える必要が出てきます。。。)

(3)word.yomiファイルに新しく単語を追加、さらに変換。
参考サイト再掲

usicolog.nomaki.jp

 辞書の作成は、単語帳を作り、それを変換することで作成できます。

(前回やったけど、あんまりわかってなかったな。単語帳を作って、それを変換しなくてはいけない、あと、julius-kitsフォルダ下に作成しなきゃいけない
 単語帳(word.yomiとした)を、julius-kitsフォルダ下に作成します。単語帳ファイルには"認識させたい単語"+"Tab"+"単語の読み" を記述します。

今回新たに追加したword.yomiは以下の通り。

$ vim word.yomi
-----------------------------------
ポルカ ぽるか
トライエブリシング とらいえぶりしんぐ
シャキーラ しゃきーら
オッケー おっけー
ポケモンはらはらリレー ぽけもんはらはらりれ
ポケモン言えるかな ぽけもんいえるかな
めざせポケモンマスター めざせぽけもんますた
エレクトリカルパレード えれくとりかるぱれーど
Under_The_Sea あんだーざしー
とまれ とまれ
-----------------------------------

※トライエブリシングのは入れていても大丈夫だった。(エラー出なかった)

ポケモンはらはらリレーポケモン言えるかなを並べていたが、ちゃんと音声を区別してくれた。

Under_The_SeaはUnder The SeaとSpace区切りだとエラーになったので_を入れてみたところ、エラーは出なかった。ただし、aquesTalk Piはこのタイトルを「アンダーザえすいーえー」と読み上げよった。意図した読み上げをしてほしい場合は、「

アンダーザシー あんだーざしー」としなければいけないのかもしれない。(後で変えよう。。)


作成した単語帳(word.yomi)を、juliusが認識可能な単語辞書ファイル(word.dic)に変換します。
$ iconv -f utf8 -t eucjp ~/word.yomi | ~/julius-4.3.1/gramtools/yomi2voca/yomi2voca.pl > ~/julius-kits/dictation-kit-v4.3.1-linux/word.dic

「曲名(mp3のファイル名) 読み方」だが、曲名と読み方の間をTabで区切ってないとここでエラーが出てた。

 

(4)/home/pi/julius-4.3.1/jclient-perlのフォルダに作っていたjclient_music.plのファイルをテキストエディタで開いて、こっちもいじる。

jclient_music.plの中身は下記

-----------------------------------
#! /usr/bin/perl
use strict;
use IO::Socket;
use IO::Select;

my $host = "localhost";
my $port = 10500;

print STDERR "$host($port) に接続します\n";

# Socketを生成して接続
my $socket;
while(!$socket){
$socket = IO::Socket::INET->new(PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
);
if (!$socket){
printf STDERR "$host($port) の接続に失敗しました\n";
printf STDERR "再接続を試みます\n";
sleep 10;
}
}

print STDERR "$host($port) に接続しました\n";

# バッファリングをしない
$| = 1;
my($old) = select($socket); $| = 1; select($old);

# Selecterを生成
my $selecter = IO::Select->new;
$selecter->add($socket);
$selecter->add(\*STDIN);

# 各種コマンド
my $command_start = '~/aquestalkpi/AquesTalkPi "みゅうじっく 、スタート!" | aplay';
my $command_stop = '~/aquestalkpi/AquesTalkPi "みゅうじっく 、ストップ!" | aplay';
my $command_speak = '~/aquestalkpi/AquesTalkPi "、、えー、、、、hogehoge、を再生します。" | aplay';
my $command_retry = '~/aquestalkpi/AquesTalkPi "えっ? 、なんだって?" | aplay';
my $command_running = '~/aquestalkpi/AquesTalkPi "音楽再生中だよ。静かにしてね" | aplay';
my $command_play_mp3 = 'mpg321 /home/pi/work/music/musicname.mp3 &';
my $command_kill_mp3 = 'perl /home/pi/julius-4.3.1/jclient-perl/killmp3.pl';
my $musicPlay = 0;#音楽再生フラグ。2重起動防止

while(1){
my ($active_socks) = IO::Select->select($selecter, undef, undef, undef);

foreach my $sock (@{$active_socks}){
# Juliusからの出力を表示
if ($sock == $socket){
while(<$socket>){
print $_;
if ($_ =~/.*<WHYPO WORD=\"([^\"]{1,})\"/) {
print "$1\n";
my $callName = $1;
print "$callName\n";
my $result = "";
my $exeCom;
my $exeMusic;

if ( ($callName eq "ポルカ"
|| $callName eq "エレクトリカルパレード"
|| $callName eq "トライ・エブリシング"
|| $callName eq "シャキーラ"
|| $callName eq "Under_The_Sea"
|| $callName eq "オッケー"
|| $callName eq "ポケモンはらはらリレー"
|| $callName eq "ポケモン言えるかな"
|| $callName eq "めざせポケモンマスター"
)
&& $musicPlay == 0) {
$exeCom = $command_speak;
$exeMusic = $command_play_mp3;
$exeCom =~ s/hogehoge/$callName/;
$exeMusic =~ s/musicname/$callName/;
$result = system ($exeCom);
$result = system ($command_start);
$result = system ($exeMusic);
$musicPlay = 1;

} elsif ($callName eq "とまれ") {
$result = system ($command_stop);
$result = system ($command_kill_mp3);
$musicPlay = 0;
} elsif ($musicPlay == 1 ) {
$result = system ($command_running);

} else {
$exeCom = $command_retry;
$result = system ($exeCom);
}
}

last if(/^\./);
}
# 標準入力をJuliusに送信
}else{
my $input = <STDIN>;
# 小文字を大文字に変換
$input =~ tr/a-z/A-Z/d;

print $socket $input;
}
}
}
-----------------------------------

(5)LXTerminalで

$ julius -C ~/julius-kits/dictation-kit-v4.3.1-linux/word.jconf -module

続いて、LX Terminalで別のタブを開いて下記を打ち込んでエンター
$ perl ~/julius-4.3.1/jclient-perl/jclient_music.pl

 

ボソっとマイクに向かって「シャキーラ」とつぶやくと

えー、、、、シャキーラ、を再生します。みゅうじっく 、スタート!」と答えてくれて(音声応答)、ちゃんとシャキーラ.mp3を流してくれる。「とまれ」というと音楽止めてくれる。

音声認識の点でマイクの感度が高すぎると周囲の雑音をすぐ拾って勝手に変換してしまう気がした。気のせいかなぁ。マイクの感度を下げてみたりしている。もしくは、周囲がテレビつけてたりして騒がしいと音声認識しにくいのかもしれない。夜中に一人で音声認識させてる時は結構小さいつぶやきでも正しく拾ってくれるんだけどなぁ。

マイクの感度とマイク使えてるかどうかの確認は下記を行っている。

$ amixer sset Mic 54 -c 0
$ arecord -D plughw:0,0 -d 10 -f cd test.wav
$ aplay test.wav

 

あとはそうだなぁ。より一層会話している感じがほしいかなぁ。

「ウィーゴー」(→呼びかけることにより音楽再生機能がONになるとか)

「お呼びでしょうか」

「音楽流してー」

「それでは適当に流します」(シャッフル再生機能)

「次のやつ流して」(曲のスキップ)

「了解しました」

「音おっきくして」(音量大)

「はーい」

「音ちっさくして」(音量小)

「はーい」

「音楽止めて」

「はーい」

とかいう応答をやってみたい。もっとそう、会話してる感がほしい!!

「ロボ、○○して」と話しかけることをやってた人がいたと思うのでそれで研究してみよう。