💜

自分の声をクローンしてみた!Coqui TTSでの簡単音声合成プロジェクト

に公開

はじめに

最近話題の「自分の声のクローン」を実際に試してみました!

いわゆる 音声クローン技術 は、AIの力を借りて自分そっくりの声を生成できる技術です。

声を失った人の補助や、コンテンツ制作などにも応用が期待されています。

今回は オープンソースかつ無料Coqui TTS を使い、最も手軽に自分の声をクローンする方法を試した記録をまとめます。


使用した技術

  • Coqui TTS

    無料で使えるオープンソースの音声合成ライブラリ。多言語対応で日本語もOK。

  • Python

  • Mac (Intel / M1)

  • マイク(一般的なUSBマイクで十分)

GPUがあれば高速ですが、今回のプロジェクトはCPUのみでも動きます。


プロジェクト構成

プロジェクトフォルダの中身はこんな感じです:

bash
コピーする編集する
aki_voice/
├── create_voice.py         # 自分の声を録音するスクリプト
├── voice_generator.py      # 音声合成を行うスクリプト
├── models/
│   └── aki_voice.pth       # 作成した声モデル(実際にはwaveファイルを使う)
├── samples/
│   └── aki_sample.wav      # 自分の声サンプル
└── requirements.txt


全体の流れ

  1. Coqui TTSをインストール
  2. 自分の声を録音
  3. 録音した音声を使いモデル生成
  4. テキストから音声を生成して確認
  5. 既存のIoTプログラムなどに統合

1. Coqui TTSインストール

以下を実行するだけ。簡単です。

bash
コピーする編集する
pip install coqui-tts


2. 声を録音する

今回使った録音スクリプト(create_voice.py)はこちらです。

自分の声を10分~30分程度、静かな環境で録音するのがポイントです。

python
コピーする編集する
import sounddevice as sd
from scipy.io.wavfile import write
import numpy as np
import os

# 保存先パス
SAVE_PATH = os.path.join('models', 'samples', 'aki_sample.wav')

# サンプリングレート
SAMPLE_RATE = 44100

if __name__ == '__main__':
    duration = input('録音する秒数を入力してください: ')
    try:
        duration = float(duration)
    except ValueError:
        print('数字を入力してください')
        exit(1)
    print('録音開始...')
    recording = sd.rec(int(duration * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1, dtype='int16')
    sd.wait()
    print('録音終了。保存中...')
    write(SAVE_PATH, SAMPLE_RATE, recording)
    print(f'保存しました: {SAVE_PATH}')

使い方例:


python create_voice.py
# → 600 と入力すれば10分録音


3. モデル生成 & 音声合成

録音ができたら、Coqui TTSで自分の声を使って音声合成します。

今回使ったのは XTTS v2 という多言語対応モデルです。

以下は voice_generator.py の例です。

python
コピーする編集する
import os
from TTS.api import TTS
import torch

class AkiVoice:
    def __init__(self):
        print("音声モデルを初期化中...")
        device = "cuda" if torch.cuda.is_available() else "cpu"

        self.tts = TTS(
            model_name="tts_models/multilingual/multi-dataset/xtts_v2"
        ).to(device)

        self.speaker_wav = "models/samples/aki_sample.wav"
        os.makedirs("output", exist_ok=True)
        print("初期化完了!")

    def speak(self, text, output_filename="output.wav"):
        output_path = os.path.join("output", output_filename)
        try:
            print(f"音声生成中: {text}")
            self.tts.tts_to_file(
                text=text,
                speaker_wav=self.speaker_wav,
                language="ja",
                file_path=output_path
            )
            print(f"生成完了: {output_path}")
            return output_path
        except Exception as e:
            print(f"エラー発生: {e}")
            return None

    def test_voice(self):
        test_text = "こんにちは、お母さん。今日も元気ですか?"
        output_file = self.speak(test_text, "test_voice.wav")

        if output_file:
            print(f"テスト音声を生成しました: {output_file}")
            os.system(f"afplay {output_file}")  # Mac の場合再生

        return output_file

if __name__ == "__main__":
    voice = AkiVoice()
    voice.test_voice()
    voice.speak("お薬の時間です", "medicine_time.wav")
    voice.speak("今日は良い天気ですね", "good_weather.wav")


実際に試してみた感想

  • 10分の録音でも かなり自分の声に近い 音声が生成できた。
  • マイク品質は大事。ノイズが多いと精度が下がる。
  • CPUのみでも動作可能だが、生成には少し時間がかかる。
  • 短いセリフはほぼ問題なし。長文になるとイントネーションが崩れることがある。
  • 日本語も自然。ただし発音がちょっとカタカナ英語っぽいところも残る。

まとめ

  • Coqui TTS を使うと、自分の声をクローンするのは意外と簡単!
  • 商用利用にはライセンスを確認することを推奨。
  • 今後は、生成した音声を IoT 機器の会話アプリなどに組み込む予定。

自分の声で「お薬の時間です」と喋らせるのは、なかなか未来感がありました。

興味ある方はぜひ試してみてください!

さとあき

Discussion