🍣

オリジナルのスマートスピーカーを作ってみる 4 音声ファイル再生 & コンテナ構築

2024/03/16に公開

この記事は?

この記事は オリジナルのスマートスピーカーを作ってみる シリーズの続き「その4」です。

合成した音声ファイルを再生する

ラズパイで音声ファイルを再生できそうな .Net のライブラリーとして LibVLCSharp というものがあったので、試してみました。
結論としてラズパイ実機では音声再生することはできましたが、Docker コンテナ環境 (linux/arm64 debian:bookworm-slim) では再生できませんでした。

ここは無理に C# ライブラリを使わずに、ラズパイに音声再生ソフト (sox) をインストールして、C# からプロセスとして呼び出すことにしました。この方法ではラズパイ実機、コンテナ共に再生できることを確認しました。以下にコーディング例を紹介します。

bash on raspi
$ sudo apt install sox
AudioFile.cs
using System.Diagnostics;

internal class AudioFile
{
    ...
    public static void PlayAudio()
    {
        //sox の "play" コマンドを実行する
        var info = new ProcessStartInfo()
        {
            FileName = "play",
            Arguments = "./any_audio_file.wav",
            WorkingDirectory = "/any_working_directory",
            CreateNoWindow = true,
            UseShellExecute = false,
            WindowStyle = ProcessWindowStyle.Hidden,
        };

        using var audioPlayProcess = Process.Start(info);
        audioPlayProcess.WaitForExit();
    }
    ...
}

Docker 使いたい

ある程度のところまできたので、これからの動作確認は Docker でやりたいですね。(Docker の使い方を忘れてしまったので「米国AI開発者がゼロから教えるDocker講座」で復習しつつ)
しかし、コンテナ内の音声再生をホスト側スピーカーに出力する方法がわかりません。
調べてみました。

コンテナ内の音声再生をホスト側スピーカーに出力する

ググってみて、以下のチュートリアル動画を見つけてやってみました。
PulseAudio というソフトウェアを利用する方法らしいです。
(サンプルのコンテナイメージが悪いらしく、適当なイメージの latest に変えて)手順通りにやってみたら、できました。これを採用しようと思います。
https://youtu.be/SF_WMBpQ0Qs?feature=shared

Dockerfile

Dockerfile は以下のようになりました。
あとは適当に VOICEVOX ENGINE 立ち上げて docker run を実行するスクリプト (powershell) を作成して、いつでもワンタッチでアプリケーションの動作確認をできるようになりました!やったね!
これでいちいち実機ラズパイにデプロイする必要は無くなります。

Dockerfile
FROM --platform=linux/arm64 debian:bookworm-slim

RUN apt-get update && apt-get install -y \
pulseaudio \
sox

ENV PULSE_SERVER=host.docker.internal

CMD bash

以下の記事に続く
オリジナルのスマートスピーカーを作ってみる 5 目覚まし機能の作成

Discussion