コンピューター好きのブログ

主にコンピューター・電子工作・オーディオ関連の記事を書いています。

MENU

スマホとRaspberry Piを使ってスマートスピーカーを作ってみた(手持ちのmp3ファイル再生編)

f:id:toomath:20180912224032j:plain

 

今回は声で音楽を再生するシステムを作ります。

 

スマホのAndroidアプリからRaspberry PiのPythonアプリに音声認識した言葉データを送り、解析するところまでは前回と同じです。

それ以降の流れは以下になります。

 

  

Raspberry PiのPythonアプリで言葉データが音楽再生の指示であることを認識する

 Androidアプリから受信した言葉データに「…を聞かせて」「…を流して」が含まれていたら、音楽の再生を指示されたと認識し、もうひとつのRaspberry Piにそのまま言葉データを送信します。

 

言葉データを解析するRaspberry Piと音楽を再生するRaspberry Piが別になっているのは、前者のRaspberry Piに赤外線リモコン機能を付けているためです。

 

今後、このRaspberry Piからテレビだけでなく色んな家電に赤外線リモコン信号を飛ばしたかったので、テレビから離れた部屋の隅に設置しました。

しかし、音楽はテレビにつながっているアンプから流したかったので、別にしたというわけです。

 

CDからmp3として取り込んだファイルのリストを作成する

うちはファイルサーバーにCDから取り込んだ曲をmp3ファイルとして保存しています。そして、このファイルは家中のパソコンやスマホ、タブレットなどから参照可能となっています。

今回はRaspberry Piからこのmp3ファイルをネットワーク経由で参照して再生することにします。

 

まず、Raspberry Piでファイルサーバーが見られるようにマウントします。ファイルサーバーはUbuntu Linuxなのでnfsを使います。

 

そして、すべてのmp3ファイルのフルパスタグ情報を読み込んでファイルに書き出すPythonアプリを作ります。1個のmp3ファイルのフルパスとタグ情報は1行にまとめて書き出すようにします。タグ情報の読み取りにはid3readerというモジュールを使いました。

 

このPythonリストを実行して出来たファイルの中身は以下のような感じです。

先頭から ”mp3ファイルのフルパス_-_-歌手名_-_-アルバム名_-_-曲名” となっています。

/mnt/ubuntu/Music/Shared/Music/Mr.Children/Mr.Children 1996-2000/01 名もなき詩.mp3_-_-Mr.Children_-_-Mr.Children 1996-2000_-_-名もなき詩
/mnt/ubuntu/Music/Shared/Music/Mr.Children/Mr.Children 1996-2000/02 花-Memento Mori-.mp3_-_-Mr.Children_-_-Mr.Children 1996-2000_-_-花-Memento Mori-
/mnt/ubuntu/Music/Shared/Music/Mr.Children/Mr.Children 1996-2000/03 Mirror.mp3_-_-Mr.Children_-_-Mr.Children 1996-2000_-_-Mirror
/mnt/ubuntu/Music/Shared/Music/Mr.Children/Mr.Children 1996-2000/04 Everything(It's you).mp3_-_-Mr.Children_-_-Mr.Children 1996-2000_-_-Everything(It's you)

 

Raspberry PiのPythonアプリで指示の内容に含まれる曲名や歌手名などにマッチした曲のmp3ファイルを再生する

いよいよ音楽の再生です。

Raspberry PiのPythonアプリで処理を行います。

 

まずはアプリで受信した言葉データから曲名や歌手名などを取り出します。

たとえば「およげた〇やきくんを聞かせて」という言葉データが送られてきたら、「およげた〇やきくん」の部分を取り出します。

 

そして、上で作成したmp3ファイルリストに「およげた〇やきくん」を含む行がないかを調べます。各行にはmp3ファイルのタグ情報が含まれているので、曲名や歌手名やアルバム名に「およげた〇やきくん」が含まれていればヒットすることになります。

 

ヒットする行が見つかったらその行のフルパス情報を取り出し、mpg321というコマンドに渡して再生します。mpg321の実行にはsubprocessモジュールのcheck_outputメソッドを使いました。

「およげた〇やきくん」は曲名ですが、歌手名やアルバム名、特定のキーワードなどであれば、複数の曲がヒットすることがあります。その場合はヒットする曲を順次連続して再生します。

 

以上で、音声認識により音楽の再生を行う仕組みを構築できました。

ただこのシステム、いくつか難点があり、そのうち使わなくなってしまいました。

  1. mp3ファイルとして持っていない曲は流せない
  2. 英語のタイトルの曲を再生しようとすると、音声がアルファベットではなくカタカナで認識されてしまい、リストにヒットしないことがある(英語の発音が悪い?)

2は今のところ対処方法を思いつきませんが、1についてはYouTubeの再生が出来ればよいのではと思いつきました。今度やってみようと思います。