高火力 DOK × OpenVoice ハンズオン
この記事は、さくらインターネットが実施した高火力 DOKハンズオンの参加者に提供していた資料を、一般公開するために記事化したものです。
はじめに
OpenVoiceとは?
OpenVoiceは、ボイスクローンができるAIモデルです。OpenVoiceは、以下の特徴を持っています。
- 正確なトーンカラーのクローニング
- 柔軟なボイススタイルコントロール
- ゼロショット学習
OpenVoice V2
OpenVoice V2は、2024年4月にリリースされました。V1と比べて、以下の特徴があります。
- より良いオーディオ品質
- ネイティブの多言語サポート
V2では、以下の言語がサポートされています。
- 英語
- 日本語
- フランス語
- スペイン語
- 中国語
- 韓国語
複数のイントネーション
英語はイントネーション別として、イギリス・アメリカ・インド・オーストラリアの4つのアクセントがサポートされています。
まずは試してみる
高火力 DOKにログインする
さくらのクラウドからログインしてください。

さくらのクラウドユーザーとしてログインする
ユーザーコード・会員ID・パスワードは指定したものを使ってください。

メニューから高火力 DOKを選択する

タスクの作成と実行

なお、実行例の画面はダークテーマを使用しています(デフォルトはライトテーマです)。左メニューの設定にてダークテーマを使用にチェックを入れるとダークテーマになります。
タスクの新規作成を選ぶ

以下の通りに入力
環境変数は + 追加 ボタンを押して追加してください。
- イメージ
dok-handson.sakuracr.jp/openvoice - 環境変数
- TEXT
Hello, everyone. We're holding the DOK hands-on, today. - LANG
EN
- TEXT
入力イメージ

入力が終わったら、 作成 ボタンを押してください。

確認ダイアログが出るので、作成 ボタンを押してください。

実行中の画面です。 状態 のところの文字で状況が判断できます。

DOKのタスクで行っていること
- Dockerイメージの取得
- コンテナの実行
- コンテナの破棄
メモ
- Dockerイメージの取得には、それなりに時間がかかります(10GB超えもざらなので…)。
- コンテナ実行時にモデルを取得するものが多く、そこも時間がかかります。
- HTTP URIは、タスク実行中にアクセスできるHTTPサーバーです。
スクリプト側でリクエストを受け取って処理できます。
タスクの実行完了後
実行完了すると、 アーティファクト の項目に ダウンロード が表示されます。

音声の確認
ダウンロードしたtar.gzファイルを解凍すると、MP3ファイルが確認できます。再生して、 Hello, everyone. We're holding the DOK hands-on, today. を話しているのを確認してください。
英語の場合、各イントネーションでのMP3ファイルが作成されます。
リファレンス音声を作る
自分の声をクローンする場合には、まずリファレンス(参考)になる音声データが必要です。
スマートフォンのボイスレコーダーで録音したり、Online Voice Recorder - マイクからの音声録音が利用できます。
音声を録音する
ある程度長い方が良いので、青空文庫のアクセスランキングから気に入った作品を読んでみてください(3〜4分程度)。
例: グリム兄弟 Bruder Grimm 楠山正雄訳 赤ずきんちゃん ROTKAPPCHEN
音声ファイルをアップロードする
音声ファイルを、HTTPアクセスできる場所に保存します。
以下は、さくらのクラウドのオブジェクトストレージを利用する例ですが、ご自身で別なクラウドストレージを使ってもらっても大丈夫です。
オブジェクトストレージを選択する
さくらのクラウドのホームに戻ります。

オブジェクトストレージを選択

サイトを選択

バケットを選択
さらに バケットの追加 ボタンを押してください。

バケットの追加
分かりやすいものを設定してください。

アップロード
作成したバケットを選んで、 アップロード ボタンを押します。

アップロードする
public-read を付けておいてください。

アップロードしたら、以下のURLでMP3ファイルにアクセスできるか確認してください。このURLをDOKの環境変数 REFERENCE として指定します。
https://s3.isk01.sakurastorage.jp/(バケット名)/(ファイル名).mp3
タスクのコピー
先ほど実行完了したタスクを開きます。

コピーする
コピーして新規作成 を押します。

リファレンスを追加する
環境変数に REFERENCE を追加して、先ほどアップロードしたMP3ファイルのURLを設定してください。

タスクを再実行する
タスクを再度実行して、自分の声のクローニングが成功しているか確認してください。
ハンズオン終了
ハンズオンの内容は以上になります。DOKの面白さとして「タスクをたくさん作成できる」点があります。ぜひタスクをコピーして、さまざまな条件で実行してください。
Dockerイメージの作り方
ここからはハンズオンの中では実施しなかったDockerイメージの作成を行います。テクニカルな内容になるので、作成には1時間以上かかると思われます。
必要なもの
- ターミナル
オプショナル
- Docker
- 手元にDocker環境がある方は、ローカルでも構築可能です。
- Docker環境がない場合は、さくらのクラウドを利用できます。
さくらのクラウドでサーバを立てる
さくらのクラウドのホームに戻り、 さくらのクラウド を選択します。

追加ボタンを押す
サーバ の 追加 ボタンを押します

情報を入力する
サーバのスペックを以下のように設定してください。
- 仮想コア
4 - メモリ
4GB - 新規ディスクを作成
- アーカイブ
Ubuntu Server 24.04.1 LTS 64bit - ディスクサイズ
100GB - インターネットに接続
- 管理者のパスワード
十分分かりづらいもの - ホスト名
分かりやすいもの(dokなど) - 公開鍵
必要であれば - サーバーの名前
分かりやすいもの(dokなど)
サーバを追加
作成 ボタンを押します。

確認する
確認ダイアログが出るので、 作成 ボタンを押してください。

サーバを確認
少し待つと、サーバが立ち上がります。

サーバに接続する
サーバへは ssh で接続してください。ユーザー名は ubuntu です。
サーバ内での作業
ここからはサーバ内(またはローカル)での作業になります。
Dockerのインストール
Dockerをインストールします。
$ sudo apt-get update -y
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh ./get-docker.sh
Dockerを試す
今のコマンドが通れば、Dockerはインストールされています。
$ sudo docker run hello-world
Hello from Docker!
:
For more examples and ideas, visit:
https://docs.docker.com/get-started/
ベースになるリポジトリ
ベースはmyshell-ai/OpenVoiceを利用し、この中に必要なファイルを作成していきます。
git clone https://github.com/myshell-ai/OpenVoice.git
cd OpenVoice
checkpoint のダウンロードと解凍
checkpointをダウンロードし、 checkpoints_v2 ディレクトリに解凍します。
$ wget https://myshell-public-repo-host.s3.amazonaws.com/openvoice/checkpoints_v2_0417.zip -O checkpoints_v2.zip
$ unzip checkpoints_v2.zip
$ rm checkpoints_v2.zip
Dockerfile の作成
ここからはDockerfileの中で行っていきます。リポジトリの中に Dockerfile を作成して、編集してください。
ベースイメージ
ベースは FROM continuumio/miniconda3 です。
FROM continuumio/miniconda3
conda の設定
condaの設定を行います。
RUN conda create -n openvoice python==3.9
SHELL ["conda", "run", "-n", "openvoice", "/bin/bash", "-c"]
必要なライブラリのインストール
OpenVoiceはffmpegを使っているので、それをインストールします。 /opt/artifact はDOKのアウトプット先のディレクトリです。
RUN apt-get update && \
apt-get install -y ffmpeg && \
mkdir /app /opt/artifact
必要なPythonライブラリのインストール
OpenVoiceのリポジトリのファイルをすべてコピーします。そして、OpenVoice用にMeloTTSをインストールします。argparseやboto3はCLI実行用です。
WORKDIR /app
COPY . .
RUN pip install -e . && \
pip install argparse && \
pip install boto3 && \
pip install git+https://github.com/myshell-ai/MeloTTS.git && \
python -m unidic download
docker-entrypoint.sh の準備
Docker実行の際に呼び出す docker-entrypoint.sh (内容は後述)を準備します。
RUN chmod +x /app/docker-entrypoint.sh
# Dockerコンテナー起動時に実行するスクリプトを指定して実行
CMD ["/bin/bash", "/app/docker-entrypoint.sh"]
Dockerfile全体
Dockerfileの全体はGitHubリポジトリで確認してください。
docker-entrypoint.sh の作成
docker-entrypoint.sh はDockerコンテナー起動時に実行するスクリプトです。ここでは環境変数をチェックして、 runner.py を呼び出します。
$ wget https://raw.githubusercontent.com/goofmint/Dok-OpenVoice-Handson/refs/heads/main/docker-entrypoint.sh
docker-entrypoint.shの内容
行っている処理はシンプルなので、内容はGitHubリポジトリで確認してください。
runner.py の作成
runner.py は実際に処理を行うスクリプトです。まず必要なライブラリをインポートします。
import os
import torch
from openvoice import se_extractor
from openvoice.api import ToneColorConverter
from melo.api import TTS
import argparse
import nltk
import boto3
nltk.download('averaged_perceptron_tagger_eng')
パラメータの取得
docker-entrypoint.sh から渡されたパラメータを取得します。
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument(
'--output',
default='/opt/artifact',
help='出力先ディレクトリを指定します。',
)
arg_parser.add_argument(
'--text',
default='',
help='読み上げる文章',
)
arg_parser.add_argument(
'--id',
default='',
help='タスクIDを指定します。',
)
arg_parser.add_argument(
'--lang',
default='JP',
help='読み上げる言語を指定',
)
arg_parser.add_argument(
'--reference',
default='resources/example_reference.mp3',
help='リファレンスの音声',
)
arg_parser.add_argument('--s3-bucket', help='S3のバケットを指定します。')
arg_parser.add_argument('--s3-endpoint', help='S3互換エンドポイントのURLを指定します。')
arg_parser.add_argument('--s3-secret', help='S3のシークレットアクセスキーを指定します。')
arg_parser.add_argument('--s3-token', help='S3のアクセスキーIDを指定します。')
args = arg_parser.parse_args()
オブジェクトストレージ用のオブジェクトを準備
S3_ではじまる環境変数があれば、それを使ってS3オブジェクトを作成します。
s3 = None
if args.s3_token and args.s3_secret and args.s3_bucket:
# S3クライアントの作成
s3 = boto3.client(
's3',
endpoint_url=args.s3_endpoint if args.s3_endpoint else None,
aws_access_key_id=args.s3_token,
aws_secret_access_key=args.s3_secret)
OpenVoiceの設定
OpenVoice/demo_part3.ipynb at main · myshell-ai/OpenVoiceの内容に沿って、OpenVoiceを準備します。
ckpt_converter = 'checkpoints_v2/converter'
device = "cuda:0" if torch.cuda.is_available() else "cpu"
output_dir = args.output
tone_color_converter = ToneColorConverter(f'{ckpt_converter}/config.json', device=device)
tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')
os.makedirs(output_dir, exist_ok=True)
reference_speaker = args.reference
target_se, audio_name = se_extractor.get_se(reference_speaker, tone_color_converter, vad=True)
from melo.api import TTS
src_path = f'{output_dir}/tmp.wav'
speed = 1.0
model = TTS(language=args.lang, device=device)
speaker_ids = model.hps.data.spk2id
音声の生成とアップロード
音声を生成し、アップロードします。たとえば EN を指定した場合、インド風英語やオーストラリア風英語など複数のキーが speaker_ids に入ってきます。
for speaker_key in speaker_ids.keys():
speaker_id = speaker_ids[speaker_key]
speaker_key = speaker_key.lower().replace('_', '-')
source_se = torch.load(f'checkpoints_v2/base_speakers/ses/{speaker_key}.pth', map_location=device)
model.tts_to_file(args.text, speaker_id, src_path, speed=speed)
save_path = f'{args.output}/{args.id}_{speaker_key}.wav'
# Run the tone color converter
encode_message = "@MyShell"
tone_color_converter.convert(
audio_src_path=src_path,
src_se=source_se,
tgt_se=target_se,
output_path=save_path,
message=encode_message)
# オブジェクトストレージにアップロード
if s3 is not None:
s3.upload_file(
Filename=save_path,
Bucket=args.s3_bucket,
Key=os.path.basename(save_path))
全体の処理
runner.py の全体の内容は GitHubリポジトリで確認してください。
Dockerイメージのビルド
ここまでの内容で、Dockerイメージをビルドします。
コンテナレジストリの用意
Dockerイメージを登録するコンテナレジストリを作成します。さくらのクラウドのホームで、さくらのクラウド を選択します。

左側のメニューの グローバル の中にある コンテナレジストリ を選択します。

追加 を押して、コンテナレジストリを作成します。最低限、以下の入力が必要です。
| 項目 | 設定 |
|---|---|
| 名前 | 分かりやすい、任意の名前を入力してください。 |
| コンテナレジストリ名 | ドメイン名に使われます。以下では、 EXAMPLE.sakuracr.jp として説明します。 |
| 公開設定 | Pullのみとします |
ユーザーの作成
コンテナレジストリを作成したら、作成したコンテナレジストリを一覧でダブルクリックします。

詳細表示にて、ユーザータブをクリックします。

追加 ボタンを押し、ユーザーを作成します。 YOUR_USER_NAME と PASSWORD は任意のものを指定してください。
| 項目 | 設定 |
|---|---|
| ユーザー名 | YOUR_USER_NAME |
| パスワード | YOUR_PASSWORD |
| ユーザ権限設定 | All |
Dockerイメージのビルド
EXAMPLE.sakuracr.jp の部分は、作成したコンテナレジストリのドメイン名に置き換えてください。また、 openvoice は任意の名前で大丈夫です(以下はその名称で読み替えてください)。
sudo docker build \
-t EXAMPLE.sakuracr.jp/openvoice:latest .
コンテナレジストリへのログイン
作成したコンテナレジストリにログインします。ログインIDとパスワードが求められるので、作成したものを入力してください。
sudo docker login EXAMPLE.sakuracr.jp
イメージのプッシュ
作成したイメージをコンテナレジストリにプッシュします。イメージサイズが大きいので、数十分かかります。
sudo docker push EXAMPLE.sakuracr.jp/openvoice:latest
DOKで実行する
リポジトリがプッシュできたら、一番最初に行ったようにDOKでタスクを実行します。
- イメージ
EXAMPLE.sakuracr.jp/openvoice - 環境変数
- TEXT
お疲れ様でした! - LANG
JP
- TEXT
終了時のお片付け
忘れずに停止・削除をお願いします。
- さくらのクラウドのサーバ
- オブジェクトストレージ
高火力 DOKについては、特に作業はありません。
以上でハンズオンとDokcerイメージの作り方は終了です。