はじめに
日本語に特化したオープンな音声合成モデル Irodori-TTS を、Google Cloud の Cloud Run(NVIDIA L4 GPU) に載せて、自分のアカウントからだけ呼べる音声合成 API にしました。
無料の Google Colab や Local Mac PC での稼働を試していましたが、次のような手間がありました。
- 使うたびにセルを実行し、トンネルの URL を貼り替える (Google Colab)
- ランタイムを削除すると、登録した声が消える (Google Colab)
- Mac(M4)のローカルでは、1分の音声に約4分かかる (Locap Mac PC)
Cloud Run なら、呼ばれたときだけ GPU インスタンスが起動し、使わないときは0台になります。URL は固定で、声は Cloud Storage に残ります。deploy.sh を1回実行すれば、API の有効化からデプロイまで終わります。
この記事では、構成の考え方と注意点を本文に書き、実際のコマンドは折りたたみに入れています。
記事の内容は 2026年10月時点で構築した環境の内容です。Cloud Run の GPU 対応リージョンや料金は変わることがあるので、公式ドキュメントもあわせて確認してください。
動画
当記事の参考動画を作成しています。
Irodori-TTS で合成した音声を使用しています。ご参照ください。
Irodori-TTS とは
Aratako 氏が公開している、日本語のテキスト読み上げ(TTS)モデルです。
- 参照音声で声をまねる:数秒〜数十秒の録音を渡すと、その声で読み上げます。登録した声を使えば、全ページを同じ声で読めます。
-
文章で声を作る(Voice Design):
captionに「落ち着いた優しい女性の声」のように書くと、録音なしで声質を指定できます。 -
OpenAI 互換の API サーバー:Irodori-TTS-Server が
POST /v1/audio/speechを提供します。今回はこれを Cloud Run に載せます。 - 透かし入り:生成音声には、聞こえない透かし(SilentCipher)が自動で入ります。
今回使うモデルは Aratako/Irodori-TTS-v4.1-Small(40ステップの高品質版)です。
全体の構成
- Cloud Build でコンテナイメージを作り、Artifact Registry に保存して、Cloud Run にデプロイします。
- 声は Cloud Storage のバケットに置き、Cloud Run からフォルダとしてマウントします。声を追加しても再デプロイは要りません。
- アプリは ID トークンを付けて Cloud Run を呼びます。認証情報はアプリのサーバー側だけで扱い、ブラウザには渡しません。
Colab や Mac で動かす場合との比較
| Google Colab | Mac(ローカル) | Cloud Run(この構成) | |
|---|---|---|---|
| 使い始める手間 | 毎回セルを実行 | サーバーを起動して待つ | 不要(呼べば自動で起動) |
| 接続先 URL | 起動のたびに変わる | この Mac の中だけ | 固定 |
| 登録した声 | ランタイム削除で消える | 残る | バケットに残る |
| 生成の速さ | L4 GPU | 1分の音声に約4分(M4) | L4 GPU |
| 費用 | 計算ユニットを消費 | なし | 起動中だけ GPU 課金 |
| 使える場所 | Colab を開いている間 | この Mac だけ | 認証できればどこからでも |
注意点もあります。0台からの初回は、起動とモデルの読み込みで数十秒〜数分待ちます。また、原稿や声のデータは Google Cloud に送られます。
主な設定値
| 項目 | 設定値 | 理由 |
|---|---|---|
| サービス名 | irodori-tts |
|
| リージョン |
asia-southeast1(シンガポール) |
Cloud Run の L4 GPU は東京(asia-northeast1)非対応 |
| GPU |
nvidia-l4 × 1、ゾーン冗長なし |
割り当てが初回デプロイ時に自動付与される |
| CPU・メモリ | 4 vCPU・16Gi、CPU 常時割り当て | GPU 利用時の必須条件 |
| 台数 | 最小0〜最大1、同時実行1 | 使わないときは0台で課金なし。上限は L4 1台分 |
| タイムアウト | 600秒 | 長文の合成に備える |
| ポート | 8080 | コンテナの IRODORI_PORT と合わせる |
| 認証 | --no-allow-unauthenticated |
roles/run.invoker を持つアカウントだけが呼べる |
| モデル | Aratako/Irodori-TTS-v4.1-Small |
重みをイメージに含め、起動時にダウンロードしない |
| 声の保存先 |
gs://<PROJECT_ID>-irodori-voices を /app/voices にマウント |
再デプロイしても声が消えない |
| イメージ | asia-southeast1-docker.pkg.dev/<PROJECT_ID>/irodori/irodori-tts:full |
Artifact Registry |
前提条件
- 課金が有効な Google Cloud プロジェクトと、そのプロジェクトのオーナー権限(API 有効化・バケット作成・デプロイに必要)
-
gcloud(Google Cloud CLI)。Mac はbrew install --cask google-cloud-sdk、または Cloud Shell で実行します -
Dockerfileとdeploy.sh(記事末尾の付録に全文があります) - 声を登録する場合は、本人の同意を得た参照音声(WAV/FLAC、20〜40秒)
ローカルに Docker は不要です。イメージのビルドは Cloud Build 上で行います。
構築手順
全体の流れは次のとおりです。手順3〜7 は deploy.sh がまとめて実行するので、ふだんは 手順1・2 のあと手順8 を実行するだけです。手順3〜7 は、スクリプトの中身を理解したいときや、途中で失敗したときの確認用です。
手順1:gcloud にログインする
アプリから呼ぶ場合は、アプリ用の認証(ADC)にもログインしておきます。
コマンド
gcloud auth login
gcloud auth application-default login # アプリから呼ぶときに使う認証(ADC)
手順2:Dockerfile を用意する
上流の Dockerfile は BuildKit のキャッシュマウントを使っているため、Cloud Build では通りませんでした。そこで次の方針で書き直しています。
- ベースは
python:3.10-slim。build-essential・git・libsndfile1を入れる - サーバーは
Aratako/Irodori-TTS-Serverを clone し、コミット61012c7に固定する - モデルとコーデックはビルド時に取得する(コールドスタートの短縮)
- FFmpeg は入れない。そのため入出力は WAV/FLAC が前提になる
高速版の Aratako/Irodori-TTS-v4.1-Small-MF(4ステップ)も ARG IRODORI_HF_CHECKPOINT を変えれば使えます。ただ、録音した声ではにごりが出やすかったので、筆者は使っていません。
Dockerfile の全文は付録にあります。
コンテナの環境変数
| 変数 | 値 |
|---|---|
IRODORI_HOST / IRODORI_PORT
|
0.0.0.0 / 8080
|
IRODORI_MODEL_DEVICE / IRODORI_CODEC_DEVICE
|
cuda |
IRODORI_MODEL_PRECISION / IRODORI_CODEC_PRECISION
|
bf16 |
IRODORI_PRELOAD |
true(起動時にモデルを読み込む) |
IRODORI_DEFAULT_VOICE |
none |
IRODORI_ALLOW_NO_REF_VOICE |
true |
IRODORI_DEFAULT_RESPONSE_FORMAT |
wav |
IRODORI_MAX_CONCURRENT_SYNTHESIS |
1 |
手順3:変数を決め、API を有効にする
環境ごとに変えるのは PROJECT_ID だけで、ほかは既定値のままで構いません。
コマンド
# 環境ごとに変える値(PROJECT_ID 以外は既定のままでよい)
PROJECT_ID=<自分のプロジェクトID>
REGION=asia-southeast1 # L4 対応リージョン
SERVICE=irodori-tts
REPO=irodori
IMAGE=${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO}/${SERVICE}:full
VOICES_BUCKET=${PROJECT_ID}-irodori-voices
gcloud config set project "${PROJECT_ID}"
gcloud services enable run.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
手順4:Artifact Registry にリポジトリを作る
コマンド
gcloud artifacts repositories create "${REPO}" \
--repository-format docker --location "${REGION}"
手順5:声を置くバケットを作る
公開アクセスをブロックした、非公開のバケットにします。
コマンド
gcloud storage buckets create "gs://${VOICES_BUCKET}" --location "${REGION}" \
--uniform-bucket-level-access --public-access-prevention
手順6:Cloud Build でイメージをビルドする
PyTorch(CUDA)とモデルを含む大きなイメージなので、マシン・ディスク・時間を多めに取ります。初回は20〜40分かかります。
--region global を指定してください。リージョンを指定すると、既定のサービスアカウントにログ用バケットの権限がなく、ビルドが失敗しました。
コマンド
gcloud builds submit deploy/irodori-tts --tag "${IMAGE}" --region global \
--machine-type e2-highcpu-8 --disk-size 200 --timeout 3600s
手順7:Cloud Run にデプロイする
L4 を1枚付け、最小0台・最大1台・認証必須にします。声のバケットは /app/voices にマウントします。完了すると、サービス URL(https://irodori-tts-<番号>.asia-southeast1.run.app)が表示されます。
コマンド
gcloud run deploy "${SERVICE}" --image "${IMAGE}" --region "${REGION}" \
--gpu 1 --gpu-type nvidia-l4 --no-gpu-zonal-redundancy \
--cpu 4 --memory 16Gi --no-cpu-throttling \
--concurrency 1 --min-instances 0 --max-instances 1 \
--timeout 600 --port 8080 --no-allow-unauthenticated \
--add-volume "name=voices,type=cloud-storage,bucket=${VOICES_BUCKET}" \
--add-volume-mount volume=voices,mount-path=/app/voices
手順8:deploy.sh でまとめて実行する
手順3〜7 は deploy.sh にまとめてあります。既存のリポジトリやバケットがあれば作成を飛ばすので、モデルを更新したときの再デプロイも同じコマンドで済みます。
REGION・SERVICE・REPO・TAG・VOICES_BUCKET は環境変数で上書きできます。
コマンド
PROJECT_ID=<自分のプロジェクトID> ./deploy/irodori-tts/deploy.sh
# 例: 別リージョン・別サービス名で作る
PROJECT_ID=my-proj REGION=us-central1 SERVICE=irodori-tts-dev ./deploy/irodori-tts/deploy.sh
動作確認
gcloud run services proxy で、自分の認証のままローカルの 8088 番に中継します。こうすると、URL や ID トークンを扱わずに試せます。
コマンド(中継・ヘルスチェック・合成)
- 中継を始めます。このターミナルは開いたままにします。
gcloud run services proxy irodori-tts --region asia-southeast1 --port 8088
- 別のターミナルでヘルスチェックします。
curl -s http://localhost:8088/health
- 声を登録せずに、Voice Design で合成してみます。
curl -s http://localhost:8088/v1/audio/speech -H "Content-Type: application/json" \
-d '{"model":"irodori-tts","input":"こんにちは。音声生成のテストです。","voice":"none","response_format":"wav","irodori":{"caption":"落ち着いた優しい女性の声。丁寧でゆっくりした話し方。"}}' \
-o test.wav
response_format は wav / flac / pcm のみです。コンテナに FFmpeg を入れていないため、mp3 は使えません。
声の登録
バケット(コンテナ内の /app/voices)に置いた参照音声のファイル名(拡張子なし)が、そのまま声の ID になります。サーバーはリクエストのたびにこのフォルダを読むので、登録後の再デプロイや再起動は要りません。
| 方法 | 向いている場合 | 声の ID |
|---|---|---|
| A. バケットにファイルを置く | 1本の録音をそのまま使う。いちばん簡単 | ファイル名(narrator.wav → narrator) |
B. voices.json で対応づける |
好きな ID を付ける、複数の録音を1つの声にまとめる |
voices.json のキー |
| C. アップロード API | gcloud storage を使わず HTTP で登録する(proxy 経由) |
voice_id に指定した名前 |
参照音声を用意する
- ナレーション調で20〜40秒読み上げて録音します(最大120秒)。静かな部屋で、Bluetooth ではないマイクを使います。Mac のボイスメモは「設定」→「オーディオ品質」→「ロスレス」にします。
- 48kHz・モノラルの WAV に変換します。コンテナに FFmpeg がないため、m4a・mp3 のままでは読めません。
- 16kHz の圧縮音声など、低音質の録音は混ぜないようにします。生成音声がにごりやすくなります。
変換コマンド
# Mac(付属の afconvert)
afconvert -f WAVE -d LEI16@48000 -c 1 myvoice.m4a my-voice_01.wav
# Linux など(FFmpeg が使える場合)
ffmpeg -i myvoice.m4a -ac 1 -ar 48000 -sample_fmt s16 my-voice_01.wav
A. バケットにファイルを置く
gcloud storage cp narrator.wav gs://<PROJECT_ID>-irodori-voices/
B. voices.json で対応づける
録音は clips/ に置き、バケット直下の voices.json で ID とファイルを対応づけます。パスはバケット内の相対パスです。ref_wavs に並べると、複数の録音が1つの声になります。
- 録音をアップロードします。
gcloud storage cp my-voice_01.wav gs://<PROJECT_ID>-irodori-voices/clips/
- 今の
voices.jsonを取得して編集します(なければ新規作成します)。
gcloud storage cp gs://<PROJECT_ID>-irodori-voices/voices.json .
{
"narrator": "clips/narrator_01.wav",
"my-voice": { "ref_wavs": ["clips/my-voice_01.wav", "clips/my-voice_02.wav"] },
"my-voice-2": "clips/my-voice_02.wav"
}
- 上書きで戻します。
gcloud storage cp voices.json gs://<PROJECT_ID>-irodori-voices/voices.json
C. アップロード API(proxy 経由)
gcloud run services proxy で中継している間に実行します。ファイルはマウント先のバケットに保存されます。1回に送れるのは1ファイルだけなので、複数の録音をまとめるには B を使います。
# 新規登録
curl -s http://localhost:8088/v1/audio/voices -F voice_id=narrator -F file=@narrator.wav
# 同じ ID を差し替える
curl -s -X PUT http://localhost:8088/v1/audio/voices/narrator -F file=@narrator.wav
# 削除
curl -s -X DELETE http://localhost:8088/v1/audio/voices/narrator
登録した声を確認・使う
curl -s http://localhost:8088/v1/audio/voices
curl -s http://localhost:8088/v1/audio/speech -H "Content-Type: application/json" \
-d '{"model":"irodori-tts","input":"登録した声のテストです。","voice":"narrator","response_format":"wav"}' \
-o narrator-test.wav
声質や話し方を寄せたいときは、"irodori":{"caption":"..."} も併用できます。
別の環境に移すときは、旧バケットの中身をそのままコピーすれば、同じ ID で使えます。
コマンド
gcloud storage cp -r "gs://<旧PROJECT_ID>-irodori-voices/*" gs://<新PROJECT_ID>-irodori-voices/
本人の同意のない声や、他社 TTS の出力は参照音声に使わないでください(モデルカードと各サービスの利用規約)。
アプリからの接続と認証
筆者のスライド動画アプリでは、.env.local に接続先と声を書き、アプリのサーバーを再起動するだけで使えるようにしています。
.env.local の例とサービス URL の確認
IRODORI_URL=https://irodori-tts-<番号>.<REGION>.run.app
IRODORI_VOICE=my-voice-2
IRODORI_SPEED=1.1
IRODORI_CAPTION=柔らかく穏やかで、少し明るい女性アナウンサーのような声。はきはきとして聞き取りやすく、親しみやすい話し方。
gcloud run services describe irodori-tts --region asia-southeast1 --format 'value(status.url)'
認証の3つの経路
URL が *.run.app のときは、アプリのサーバー側が ID トークンを取得して付けます。ブラウザには鍵もトークンも渡りません。
| 用途 | 方法 | 必要な権限 |
|---|---|---|
| 自分の Mac で使う |
gcloud auth application-default login(ユーザー ADC) |
そのアカウントに roles/run.invoker(オーナーは付与済み) |
| 別のサーバーから使う | サービスアカウントの JSON 鍵(GOOGLE_APPLICATION_CREDENTIALS) |
サービスアカウントに roles/run.invoker
|
| 認証を扱いたくない |
gcloud run services proxy で中継し、http://localhost:8088 を指定 |
proxy を実行するアカウントに roles/run.invoker
|
呼び出し権限を付けるコマンド
gcloud run services add-iam-policy-binding irodori-tts --region asia-southeast1 \
--member "serviceAccount:<SA名>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role roles/run.invoker
サービスアカウントの鍵は秘密鍵です。リポジトリにコミットしないよう、.gitignore に入れておきましょう。
API キーの Bearer 認証しか持たないクライアントは、*.run.app に直接は届きません。その場合は proxy 経由で http://127.0.0.1:8088/v1/audio/speech を指定し、取得形式も WAV にしてください。
別の環境に作る
新しいプロジェクトや別のアカウントでも、変えるのは PROJECT_ID(と、必要なら REGION・SERVICE)だけです。
手順
- Google Cloud コンソールでプロジェクトを作り、課金アカウントをリンクします。
-
gcloud auth loginで、そのプロジェクトのオーナーとしてログインします。 - L4 対応リージョンを選びます。日本からは
asia-southeast1が最寄りです(2026年10月時点の対応リージョン:asia-southeast1、asia-south1(招待制)、europe-west1、europe-west4、us-central1、us-east4)。 - Dockerfile と deploy.sh を置いたフォルダで、deploy.sh を実行します。
chmod +x deploy.sh
PROJECT_ID=<新PROJECT_ID> REGION=asia-southeast1 ./deploy.sh
- 「動作確認」の3つのコマンドを実行します。
- 声を登録します。旧環境から移す場合は、バケットをコピーします。
- 新しいサービス URL をアプリに設定し、呼ぶアカウントに
roles/run.invokerを付けます。 - Cloud Billing で予算アラートを設定します。
初回デプロイで L4 の割り当てが自動付与されないときは、「IAM と管理」→「割り当て」で Cloud Run の L4 GPU(ゾーン冗長なし)を申請します。
運用・費用・注意点
- 課金:GPU はインスタンス課金です。起動中は、リクエスト後のアイドル時間も含めて課金されます。最大1台は同時に動く台数の上限で、請求額の上限ではありません。保存やビルドの費用も別にかかるので、予算アラートを設定しておくと安心です。
-
待ち時間:0台からの起動待ちを無くしたいときは
--min-instances 1にできますが、その分は常時課金になります。 - 同時処理:1件ずつ合成します。
- 入力上限:1回 4,096 文字です。長文はサーバー側で区間に分けて生成されます。
- 形式:参照音声は WAV/FLAC、応答は WAV/FLAC/PCM のみです。
- ライセンス:サーバー・モデル・コーデック・テキストエンコーダーは MIT、DACVAE は Apache-2.0 です。
-
モデル更新:Dockerfile の
SERVER_COMMITとIRODORI_HF_CHECKPOINTを変え、TAGを新しくして deploy.sh を再実行します。
止める・削除するコマンド
# サービスを削除(声のバケットとイメージは残るので、同じコマンドで戻せる)
gcloud run services delete irodori-tts --region asia-southeast1
# イメージも消す(保存費用を止める)
gcloud artifacts repositories delete irodori --location asia-southeast1
よくある問題
| 症状 | 対処 |
|---|---|
| Cloud Build がログバケットの権限エラーで失敗 |
--region global でビルドする |
| ビルドがディスク不足・タイムアウト |
--disk-size 200・--timeout 3600s を付ける |
| デプロイが GPU 割り当て不足で失敗 | 「割り当て」で L4(ゾーン冗長なし)を申請、または対応リージョンを変える |
403 |
呼ぶアカウントに roles/run.invoker がない |
401 |
ID トークンの期限切れ。gcloud auth application-default login をやり直す |
| 声が見つからない |
curl localhost:8088/v1/audio/voices で ID を確認。m4a・mp3 は WAV に変換する |
| 最初の1回だけ遅い | 0台からの起動。待ち時間を無くしたい場合は --min-instances 1(その分常時課金) |
| 生成音声がにごる | 参照音声を 48kHz のロスレス録音にする。MF(4ステップ)版モデルを使っていないか確認 |
まとめ
- Irodori-TTS-Server を Cloud Run の L4 GPU に載せると、使うときだけ起動する、固定 URL の自分専用 TTS API になります。
- 声は Cloud Storage に置くだけで使え、再デプロイは要りません。
- 構築は
deploy.shを1回実行するだけです。ハマりどころは、Cloud Build の--region globalと、FFmpeg なしによる音声形式の制約の2つでした。
まずは短い文章で合成してみて、声・話す速さ・認証の動きを確かめてから、長いナレーションに進むのがおすすめです。
付録:ファイル一式
この2ファイルを同じフォルダに置けば、リポジトリなしで構築できます。
Dockerfile
FROM python:3.10-slim
ARG SERVER_REPO=https://github.com/Aratako/Irodori-TTS-Server.git
ARG SERVER_COMMIT=61012c7
ARG IRODORI_TTS_BACKEND=cu128
ARG IRODORI_HF_CHECKPOINT=Aratako/Irodori-TTS-v4.1-Small
ARG IRODORI_CODEC_REPO=Aratako/Semantic-DACVAE-Japanese-32dim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
DEBIAN_FRONTEND=noninteractive \
UV_LINK_MODE=copy \
UV_PROJECT_ENVIRONMENT=/app/.venv \
HF_HOME=/models/hf
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential ca-certificates git libsndfile1 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
WORKDIR /app
RUN git clone "${SERVER_REPO}" . && git checkout "${SERVER_COMMIT}" && rm -rf .git \
&& uv sync --locked --no-dev --no-editable --extra "${IRODORI_TTS_BACKEND}" \
&& rm -rf /root/.cache/uv
RUN /app/.venv/bin/python -c "import sys; from huggingface_hub import snapshot_download as d; [d(r) for r in sys.argv[1:]]" \
"$(echo ${IRODORI_HF_CHECKPOINT} | cut -d/ -f1-2)" "${IRODORI_CODEC_REPO}"
ENV IRODORI_HOST=0.0.0.0 \
IRODORI_PORT=8080 \
IRODORI_HF_CHECKPOINT=${IRODORI_HF_CHECKPOINT} \
IRODORI_CODEC_REPO=${IRODORI_CODEC_REPO} \
IRODORI_MODEL_DEVICE=cuda \
IRODORI_CODEC_DEVICE=cuda \
IRODORI_MODEL_PRECISION=bf16 \
IRODORI_CODEC_PRECISION=bf16 \
IRODORI_PRELOAD=true \
IRODORI_DEFAULT_VOICE=none \
IRODORI_ALLOW_NO_REF_VOICE=true \
IRODORI_DEFAULT_RESPONSE_FORMAT=wav \
IRODORI_MAX_CONCURRENT_SYNTHESIS=1
EXPOSE 8080
CMD ["/app/.venv/bin/python", "-m", "irodori_openai_tts"]
deploy.sh
#!/usr/bin/env bash
# 使い方: PROJECT_ID=your-project ./deploy.sh
set -euo pipefail
PROJECT_ID="${PROJECT_ID:?PROJECT_ID を指定してください}"
REGION="${REGION:-asia-southeast1}"
SERVICE="${SERVICE:-irodori-tts}"
REPO="${REPO:-irodori}"
TAG="${TAG:-full}"
IMAGE="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO}/${SERVICE}:${TAG}"
VOICES_BUCKET="${VOICES_BUCKET:-${PROJECT_ID}-irodori-voices}"
DIR="$(cd "$(dirname "$0")" && pwd)"
gcloud config set project "${PROJECT_ID}"
gcloud services enable run.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
gcloud artifacts repositories describe "${REPO}" --location "${REGION}" >/dev/null 2>&1 \
|| gcloud artifacts repositories create "${REPO}" --repository-format docker --location "${REGION}"
gcloud storage buckets describe "gs://${VOICES_BUCKET}" >/dev/null 2>&1 \
|| gcloud storage buckets create "gs://${VOICES_BUCKET}" --location "${REGION}" \
--uniform-bucket-level-access --public-access-prevention
gcloud builds submit "${DIR}" --tag "${IMAGE}" --region global \
--machine-type e2-highcpu-8 --disk-size 200 --timeout 3600s
gcloud run deploy "${SERVICE}" --image "${IMAGE}" --region "${REGION}" \
--gpu 1 --gpu-type nvidia-l4 --no-gpu-zonal-redundancy \
--cpu 4 --memory 16Gi --no-cpu-throttling \
--concurrency 1 --min-instances 0 --max-instances 1 \
--timeout 600 --port 8080 --no-allow-unauthenticated \
--add-volume "name=voices,type=cloud-storage,bucket=${VOICES_BUCKET}" \
--add-volume-mount volume=voices,mount-path=/app/voices
echo "完了。ローカルから使うには: gcloud run services proxy ${SERVICE} --region ${REGION} --port 8088"
