サーバーレスVOICEVOX:Cloud Runのサイドカー構成で実現する高性能音声合成
概要
今回は、人気の音声合成エンジン「VOICEVOX」をCloud Runで動かす方法について紹介します。特に、サイドカー構成を使用してVOICEVOXエンジンとアプリケーションを同時に稼働させる方法に焦点を当てます。
デモ(コールドスタートの影響でロードに時間がかかります): https://cloudrun-voicevox-53ghjmkapa-an.a.run.app/
リポジトリはこちら: https://github.com/urth-inc/cloudrun_voicevox
VOICEVOXとは?
VOICEVOXは、オープンソースの音声合成ソフトウェアです。高品質な音声を合成でき、様々なキャラクターボイスを提供しています。
WebAPIとして実装されている、VOICEVOXのエンジンはDockerイメージでも提供されているので、今回はこちらをCloud Runへデプロイしてみます。
サイドカー構成とは?
サイドカー構成は、メインのアプリケーションコンテナと補助的な機能を提供するコンテナを一緒に動かす方法です。今回の場合、Node.jsアプリケーションとVOICEVOXエンジンを別々のコンテナで動かし、アプリケーションからVOICEVOXエンジンのAPIをコールして音声合成します。
Google Cloudの解説:https://cloud.google.com/blog/ja/products/serverless/cloud-run-now-supports-multi-container-deployments
実装
アプリケーションについて
喋らせたい文言を入力して、キャラクターを選択し、音声生成ボタンを押すと数秒後に音声が生成されます。
LLMの力を借りてNode.jsで構築しました。
Cloud Runの構成
Cloud Run用の設定ファイル(service.yaml
)は以下のようになっています。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: ${SERVICE_NAME}
annotations:
run.googleapis.com/launch-stage: BETA
spec:
template:
metadata:
annotations:
run.googleapis.com/container-dependencies: "{app:[voicevox]}"
spec:
containers:
- image: ${REGION}-docker.pkg.dev/urth-toy/cloudrun-voicevox/app
name: app
ports:
- containerPort: 3000
env:
- name: "VOICEVOX_URL"
value: "http://localhost:50021"
- image: voicevox/voicevox_engine:cpu-ubuntu20.04-latest
name: voicevox
startupProbe:
initialDelaySeconds: 3
periodSeconds: 60
failureThreshold: 5
httpGet:
path: /
port: 50021
特筆すべきは、containers
で複数コンテナの定義をしているところで、この様に書くことでサイドカー構成でデプロイできます。またヘルスチェックなど、依存関係があるコンテナを正常に起動するための機能もあります。
あとは以下のgcloudコマンドでデプロイできます。
gcloud run services replace service.yaml
サイドカー構成でのデプロイに関しては、Google Cloud公式のドキュメントに詳しく書いてありあます。
スペック
service.yaml
で特にスペックを指定していませんが、デフォルトで
- app: 1CPU, 512MiB
- VOICEVOX: 1CPU, 256MiB
でデプロイされていました。
こんな貧弱なインスタンスで音声合成できるなんて、VOICEVOX恐るべしですね!
まとめ
サービスとして提供する場合には利用規約や認証などに気をつける必要がありますが、CloudRunでサクッと音声合成ができるので活用の幅が広がりますね!
また、サイドカー構成で複数のコンテナをまとめてデプロイできるので、アプリケーションの構築・管理が非常に楽になりました。ぜひ皆様もお試しください。
Discussion