0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DOK × OpenVoice ハンズオン

Last updated at Posted at 2025-03-04
1 / 80

はじめに


OpenVoiceとは?

OpenVoiceは、ボイスクローンができるAIモデルです。OpenVoiceは、以下の特徴を持っています。

  1. 正確なトーンカラーのクローニング
  2. 柔軟なボイススタイルコントロール
  3. ゼロショット学習

OpenVoice V2

OpenVoice V2は、2024年4月にリリースされました。V1と比べて、以下の特徴があります。

  1. より良いオーディオ品質
  2. ネイティブの多言語サポート

V2では、以下の言語がサポートされています。

  • 英語
  • 日本語
  • フランス語
  • スペイン語
  • 中国語
  • 韓国語

複数のイントネーション

英語はイントネーション別として、イギリス・アメリカ・インド・オーストラリアの4つのアクセントがサポートされています。


まずは試してみる


DOKにログインする

さくらのクラウドにログインしてください

image.png


会員IDとパスワードを入力する

IDとパスワードは配布されているものをご利用ください

image.png


DOKを選択する

デザインがレスポンシブなので、DOKのアイコンが下にあるかも

image.png


タスクを選ぶ

image.png


タスクの新規作成を選ぶ

image.png


以下の通りに入力

環境変数は + 追加 ボタンを押して追加してください。

  • イメージ
    dok-handson.sakuracr.jp/openvoice
  • 環境変数
    • TEXT
      Hello, everyone. We're holding the DOK hands-on, today.
    • LANG
      EN

入力イメージ

image.png


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

image.png


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

image.png


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

image.png


DOKのタスクで行っていること

  1. Dockerイメージの取得
  2. コンテナの実行
  3. コンテナの破棄

メモ

  • Dockerイメージの取得には、それなりに時間がかかります(10GB超えもざらなので…)
  • コンテナ実行時にモデルを取得するものが多く、そこも時間がかかります
  • HTTP URIは、タスク実行中にアクセスできるHTTPサーバーです
    スクリプト側でリクエストを受け取って処理できます

実行完了後

実行完了すると、 アーティファクト の項目に ダウンロード が表示されます。

image.png


音声の確認

ダウンロードしたtar.gzファイルを解凍すると、MP3ファイルが確認できます。再生して、 Hello, everyone. We're holding the DOK hands-on, today. を話しているのを確認してください。

英語の場合、各イントネーションでのMP3ファイルが作成されます。

image.png

リファレンス音声を作る

自分の声をクローンする場合には、まずリファレンス(参考)になる音声データが必要です。

スマートフォンのボイスレコーダーで録音したり、Online Voice Recorder - マイクからの音声録音が利用できます。


音声を録音する

ある程度長い方が良いので、青空文庫のアクセスランキングから気に入った作品を読んでみてください(3〜4分程度)。

例: グリム兄弟 Bruder Grimm 楠山正雄訳 赤ずきんちゃん ROTKAPPCHEN


音声ファイルをアップロードする

音声ファイルを、HTTPアクセスできる場所に保存します

以下は、さくらのクラウドのオブジェクトストレージを利用する例ですが、ご自身で別なクラウドストレージを使ってもらっても大丈夫です


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

さくらのクラウドのホームに戻ります

image.png


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

image.png


サイトを選択

image.png


バケットを選択

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

image.png


バケットの追加

分かりやすいものを設定してください

FireShot Capture 541 - オブジェクトストレージ - secure.sakura.ad.jp.jpg


アップロード

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

image.png


アップロードする

public-read を付けておいてください

image.png


アップロードしたら、以下のURLでMP3ファイルにアクセスできるか確認してください。このURLをDOKの環境変数 REFERENCE として指定します。

https://s3.isk01.sakurastorage.jp/(バケット名)/(ファイル名).mp3

タスクのコピー

先ほど実行完了したタスクを開きます。

image.png


コピーする

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

image.png


リファレンスを追加する

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

image.png


タスクを再実行する

タスクを再度実行して、自分の声のクローニングが成功しているか確認してください


一旦終了

ハンズオンの内容は以上になります。DOKの面白さとして「タスクをたくさん作成できる」点があります。ぜひタスクをコピーして、さまざまな条件で実行してください。


ここからの流れ

ここからはDockerイメージの作成を行います。作成には1時間以上かかると思われますので、ハンズオン実施中には終わらないはずです。


Dockerイメージの作り方

ここからはテクニカルな内容になります


必要なもの

  • ターミナル

オプショナル

  • Docker

  • 手元にDocker環境がある方は、ローカルでも構築可能です
  • Docker環境がない場合は、さくらのクラウドを利用できます

さくらのクラウドでサーバを立てる

さくらのクラウドのホームに戻り、 さくらのクラウド(IaaS) を選択します

image.png


追加ボタンを押す

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

image.png


情報を入力する

サーバのスペックを以下のように設定してください

  • 仮想コア
    4
  • メモリ
    4GB
  • 新規ディスクを作成
  • アーカイブ
    Ubuntu Server 24.04.1 LTS 64bit
  • ディスクサイズ
    100GB
  • インターネットに接続
  • 管理者のパスワード
    十分分かりづらいもの
  • ホスト名
    分かりやすいもの(dokなど)
  • 公開鍵
    必要であれば
  • サーバーの名前
    分かりやすいもの(dokなど)

サーバを追加

作成 ボタンを押します

image.png


確認する

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

スクリーンショット 2025-02-19 12.17.31.png


サーバを確認

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

image.png


サーバに接続する

サーバへは 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イメージを登録するコンテナレジストリを作成します。さくらのクラウドのホームで、さくらのクラウド を選択します。

image.png


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

image.png


追加 を押して、コンテナレジストリを作成します。最低限、以下の入力が必要です。

項目 設定
名前 分かりやすい、任意の名前を入力してください
コンテナレジストリ名 ドメイン名に使われます。以下では、 EXAMPLE.sakuracr.jp として説明します
公開設定 Pullのみとします

ユーザーの作成

コンテナレジストリを作成したら、作成したコンテナレジストリを一覧でダブルクリックします。

image.png


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

image.png


追加 ボタンを押し、ユーザーを作成します。 YOUR_USER_NAMEPASSWORD は任意のものを指定してください。

項目 設定
ユーザー名 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

お片付け

忘れずに停止・削除をお願いします

  • さくらのクラウドのサーバ
  • オブジェクトストレージ

DOKについては、特に作業はありません

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?