Maya1とは?感情豊かな音声を生成できるオープンソースTTSモデルの全貌を解説

Maya1 感情 豊か 音声 生成 オープンソース TTS モデル 全貌
押さえておきたいポイント
  • 完全オープンソースかつ無料で使える感情制御対応の高品質TTSモデル・Maya1
  • 自然言語による音声デザインと20種以上の感情表現をリアルタイム生成で実現
  • 商用利用可能なApache 2.0ライセンスで、個人から企業まで低コスト導入が可能

AIの進化、すごいですよね。特に音声を生成する分野(Text-to-Speech、TTS)は、人間と見分けがつかないほどになっていて、自然な音声を生成するモデルが次々と登場しています。

しかし現在主流となっているTTSの多くはクローズドソースの高価な商用サービスです。また、オープンソースであっても感情表現やリアルタイム性に課題があります。

本記事では、こうした状況を打破する可能性を秘めた画期的なオープンソース音声生成AI「Maya1」について、その概要から仕組み、具体的な使い方までを徹底解説します。

\生成AIを活用して業務プロセスを自動化/

目次

Maya1の概要

米国のAI研究ラボ「Maya Research」が2025年11月に発表したオープンソースの感情音声合成モデルです。自然言語で感情や声のトーンを細かく制御できる点が特徴で、従来の高価な商用サービスと、感情表現に乏しいオープンソースモデルの「いいとこ取り」を実現しています。プロダクション品質の音声合成を完全無料で提供し、音声AI技術の民主化を目指しているようです。

なお、声の常識を変えるElevenLabsに関しては、下記の記事をご覧ください。

Maya1の仕組み

パラメータを30億個持つLlama(LLM)ベースのトランスフォーマーアーキテクチャという仕組みを採用しています。一般的な言語モデルがテキストトークンを予測するのに対し、Maya1は「SNAC」と呼ばれるニューラル音声コーデック(AIを使って音声データを高品質に圧縮・復元する技術)のトークンを予測する点が特徴的です。この仕組みにより、約0.98kbpsという低ビットレートでもリアルタイムストリーミングが可能となります。

Maya1の特徴

Maya1の特徴

最先端のオープンソース音声AI「Maya1」は、プログラミング不要な 自然言語での声制御や、20種類超の感情表現を可能にします。開発者もクリエイターも、思いのままの音声を直感的に創造できる、その革新的な特徴をご紹介します。

自然言語による音声制御

最大の特徴は、難しいプログラミングや音声学の専門知識がなくても、日常会話のような言葉で音声スタイルを指定できることです。たとえば、「30代のアメリカ人男性で、温かみがあって会話的な雰囲気の声」と英語で指示すれば、その通りの音声が生成されます。これなら、開発者だけでなくクリエイターも、思い描いた通りの音声を直感的に作れるわけです。

20種類以上の感情表現

Maya1では、笑い(<laugh>)、ため息(<sigh>)、ささやき(<whisper>)といった感情タグを、テキストの好きな場所に入れられます。感情タグは20種類以上用意されており、台本の狙った箇所で意図した感情を表現できるのが強みです。実際、「信じられない! <gasp> なんてことだ!」と書くだけで、驚いて息をのむ瞬間が音声に反映されます。

リアルタイムストリーミング

SNACコーデックのおかげで、Maya1は低遅延のリアルタイムストリーミングが可能になっています。これは、対話型AIエージェントやゲームキャラクターの声、ライブ配信のナレーションなど、すぐに反応が必要なアプリケーションでは欠かせない機能といえるでしょう。

シングルGPUでのデプロイメント

30億パラメータという規模の大きさを考えると驚きですが、Maya1は一般的なコンシューマー向けGPU(VRAM 16GB以上)で動かせるよう設計されています。つまり、データセンターのような高額な設備がなくても、個人開発者や小規模なスタートアップが、本格的な音声生成AIを自分たちの環境で使えるということです。

同企業では、プロダクション品質の音声合成を完全無料で提供し、音声AI技術の民主化を目指しているようです。

なお、日本語含む10言語対応の多言語に対応したQwen3-TTS-Flashに関しては、下記の記事をご覧ください。

類似サービスとの比較

スクロールできます
機能Maya1ElevenLabsOpenAI TTSCoqui TTS
オープンソースはいいいえいいえはい
感情20種類以上モデルによる一部対応(話し方、トーン調整など)感情/話し方のスタイル指定
音声デザイン自然言語音声ライブラリカスタムボイス音声クローン / スタイル学習
ストリーミングリアルタイムリアルタイムストリーミング可能ストリーミング可能
費用原則無料サブスクリプション/従量課金従量課金原則無料
カスタマイズ高い(自然言語でスタイル指定)高い(カスタムボイス、デザイン)高い(カスタムボイス作成)非常に高い(モデル学習/微調整)
パラメータ30億非公開非公開様々(学習に使用するモデルによる)
類似サービス比較

Maya1の安全性・制約

非常に強力な技術である一方、Maya1にはいくつかの制約と、悪用に対する懸念が存在します。

スクロールできます
項目内容
多言語対応今のところ、公式モデルが対応しているのは英語だけです。日本語のように音の特徴が英語と大きく違う言語については、まだこれからの課題となっています。
ディープフェイクどんな声でも真似できてしまうため、悪意を持った人が「声のディープフェイク」として悪用する危険性は否定できません。Maya Research側もこのリスクは把握していて、倫理的な使い方を守るよう呼びかけています。
データバイアス学習に使われたデータが特定地域の英語話者に偏っている可能性もあり、世界中のさまざまなアクセントや話し方を完璧に再現するのは難しいかもしれません。
制約と懸念事項

Maya1の料金

Apache 2.0ライセンスの下で公開されている完全なオープンソースプロジェクトであり、無料で利用できます。初期費用、ランニングコスト、生成した音声の量に応じた従量課金などは原則として一切発生しません。 

ただし、モデルの動作に必要なハードウェアや、クラウド環境でMaya1を利用する場合のインフラ利用料(サーバー代、電力費、ネットワーク通信費など)は、ご利用者様のご負担となりますのでご注意ください。

Maya1は、秒単位で課金される多くの商用TTSサービスと比較して、圧倒的低コストで使用できます。

Maya1のライセンス

Maya1に採用されているApache 2.0ライセンスは、非常に寛容なオープンソースライセンスとして知られています。以下に、主要な権利をまとめました。

スクロールできます
利用用途可否
商用利用可能
改変可能
配布可能
特許使用可能
私的使用可能
Maya1のライセンス

Apache 2.0ライセンスは、開発者が安心してMaya1を自社のプロジェクトや製品に組み込むことが可能です。

Maya1の実装方法(手順・環境)

Maya1を実際に動かすための基本的な構築手順を説明します。

ローカル環境への構築(Windows OS)

実装した環境

  • OS: Windows11 64bit
  • GPU: NVIDIA GeForce RTX 4060 Ti 16GB
  • ソフトウェア: Python 3.10.11

前提条件

  • Pythonの事前インストールが必要
  • Windows OSのみ

実装手順

  1. 以下のサイトからコードをコピーし、.pyファイルを作成(筆者はtest.pyという名前で作成)

maya-research/maya1 · Hugging Face

実際のコードはこちら↓

#!/usr/bin/env python3

import torch

from transformers import AutoModelForCausalLM, AutoTokenizer

from snac import SNAC

import soundfile as sf

import numpy as np

CODE_START_TOKEN_ID = 128257

CODE_END_TOKEN_ID = 128258

CODE_TOKEN_OFFSET = 128266

SNAC_MIN_ID = 128266

SNAC_MAX_ID = 156937

SNAC_TOKENS_PER_FRAME = 7

SOH_ID = 128259

EOH_ID = 128260

SOA_ID = 128261

BOS_ID = 128000

TEXT_EOT_ID = 128009

def build_prompt(tokenizer, description: str, text: str) -> str:

    """Build formatted prompt for Maya1."""

    soh_token = tokenizer.decode([SOH_ID])

    eoh_token = tokenizer.decode([EOH_ID])

    soa_token = tokenizer.decode([SOA_ID])

    sos_token = tokenizer.decode([CODE_START_TOKEN_ID])

    eot_token = tokenizer.decode([TEXT_EOT_ID])

    bos_token = tokenizer.bos_token

    formatted_text = f'<description="{description}"> {text}'

    prompt = (

        soh_token + bos_token + formatted_text + eot_token +

        eoh_token + soa_token + sos_token

    )

    return prompt

def extract_snac_codes(token_ids: list) -> list:

    """Extract SNAC codes from generated tokens."""

    try:

        eos_idx = token_ids.index(CODE_END_TOKEN_ID)

    except ValueError:

        eos_idx = len(token_ids)

    snac_codes = [

        token_id for token_id in token_ids[:eos_idx]

        if SNAC_MIN_ID <= token_id <= SNAC_MAX_ID

    ]

    return snac_codes

def unpack_snac_from_7(snac_tokens: list) -> list:

    """Unpack 7-token SNAC frames to 3 hierarchical levels."""

    if snac_tokens and snac_tokens[-1] == CODE_END_TOKEN_ID:

        snac_tokens = snac_tokens[:-1]

    frames = len(snac_tokens) // SNAC_TOKENS_PER_FRAME

    snac_tokens = snac_tokens[:frames * SNAC_TOKENS_PER_FRAME]

    if frames == 0:

        return [[], [], []]

    l1, l2, l3 = [], [], []

    for i in range(frames):

        slots = snac_tokens[i*7:(i+1)*7]

        l1.append((slots[0] - CODE_TOKEN_OFFSET) % 4096)

        l2.extend([

            (slots[1] - CODE_TOKEN_OFFSET) % 4096,

            (slots[4] - CODE_TOKEN_OFFSET) % 4096,

        ])

        l3.extend([

            (slots[2] - CODE_TOKEN_OFFSET) % 4096,

            (slots[3] - CODE_TOKEN_OFFSET) % 4096,

            (slots[5] - CODE_TOKEN_OFFSET) % 4096,

            (slots[6] - CODE_TOKEN_OFFSET) % 4096,

        ])

    return [l1, l2, l3]

def main():

    # Load the best open source voice AI model

    print("\n[1/3] Loading Maya1 model...")

    model = AutoModelForCausalLM.from_pretrained(

        "maya-research/maya1", 

        torch_dtype=torch.bfloat16, 

        device_map="auto",

        trust_remote_code=True

    )

    tokenizer = AutoTokenizer.from_pretrained(

        "maya-research/maya1",

        trust_remote_code=True

    )

    print(f"Model loaded: {len(tokenizer)} tokens in vocabulary")

    # Load SNAC audio decoder (24kHz)

    print("\n[2/3] Loading SNAC audio decoder...")

    snac_model = SNAC.from_pretrained("hubertsiuzdak/snac_24khz").eval()

    if torch.cuda.is_available():

        snac_model = snac_model.to("cuda")

    print("SNAC decoder loaded")

    # Design your voice with natural language

    description = "Realistic male voice in the 30s age with american accent. Normal pitch, warm timbre, conversational pacing."

    text = "Hello! This is Maya1 <laugh_harder> the best open source voice AI model with emotions."

    print("\n[3/3] Generating speech...")

    print(f"Description: {description}")

    print(f"Text: {text}")

    # Create prompt with proper formatting

    prompt = build_prompt(tokenizer, description, text)

    # Debug: Show prompt details

    print(f"\nPrompt preview (first 200 chars):")

    print(f"   {repr(prompt[:200])}")

    print(f"   Prompt length: {len(prompt)} chars")

    # Generate emotional speech

    inputs = tokenizer(prompt, return_tensors="pt")

    print(f"   Input token count: {inputs['input_ids'].shape[1]} tokens")

    if torch.cuda.is_available():

        inputs = {k: v.to("cuda") for k, v in inputs.items()}

    with torch.inference_mode():

        outputs = model.generate(

            **inputs, 

            max_new_tokens=2048,  # Increase to let model finish naturally

            min_new_tokens=28,  # At least 4 SNAC frames

            temperature=0.4, 

            top_p=0.9, 

            repetition_penalty=1.1,  # Prevent loops

            do_sample=True,

            eos_token_id=CODE_END_TOKEN_ID,  # Stop at end of speech token

            pad_token_id=tokenizer.pad_token_id,

        )

    # Extract generated tokens (everything after the input prompt)

    generated_ids = outputs[0, inputs['input_ids'].shape[1]:].tolist()

    print(f"Generated {len(generated_ids)} tokens")

    # Debug: Check what tokens we got

    print(f"   First 20 tokens: {generated_ids[:20]}")

    print(f"   Last 20 tokens: {generated_ids[-20:]}")

    # Check if EOS was generated

    if CODE_END_TOKEN_ID in generated_ids:

        eos_position = generated_ids.index(CODE_END_TOKEN_ID)

        print(f" EOS token found at position {eos_position}/{len(generated_ids)}")

    # Extract SNAC audio tokens

    snac_tokens = extract_snac_codes(generated_ids)

    print(f"Extracted {len(snac_tokens)} SNAC tokens")

    # Debug: Analyze token types

    snac_count = sum(1 for t in generated_ids if SNAC_MIN_ID <= t <= SNAC_MAX_ID)

    other_count = sum(1 for t in generated_ids if t < SNAC_MIN_ID or t > SNAC_MAX_ID)

    print(f"   SNAC tokens in output: {snac_count}")

    print(f"   Other tokens in output: {other_count}")

    # Check for SOS token

    if CODE_START_TOKEN_ID in generated_ids:

        sos_pos = generated_ids.index(CODE_START_TOKEN_ID)

        print(f"   SOS token at position: {sos_pos}")

    else:

        print(f"   No SOS token found in generated output!")

    if len(snac_tokens) < 7:

        print("Error: Not enough SNAC tokens generated")

        return

    # Unpack SNAC tokens to 3 hierarchical levels

    levels = unpack_snac_from_7(snac_tokens)

    frames = len(levels[0])

    print(f"Unpacked to {frames} frames")

    print(f"   L1: {len(levels[0])} codes")

    print(f"   L2: {len(levels[1])} codes")

    print(f"   L3: {len(levels[2])} codes")

    # Convert to tensors

    device = "cuda" if torch.cuda.is_available() else "cpu"

    codes_tensor = [

        torch.tensor(level, dtype=torch.long, device=device).unsqueeze(0)

        for level in levels

    ]

    # Generate final audio with SNAC decoder

    print("\n[4/4] Decoding to audio...")

    with torch.inference_mode():

        z_q = snac_model.quantizer.from_codes(codes_tensor)

        audio = snac_model.decoder(z_q)[0, 0].cpu().numpy()

    # Trim warmup samples (first 2048 samples)

    if len(audio) > 2048:

        audio = audio[2048:]

    duration_sec = len(audio) / 24000

    print(f"Audio generated: {len(audio)} samples ({duration_sec:.2f}s)")

    # Save your emotional voice output

    output_file = "output.wav"

    sf.write(output_file, audio, 24000)

    print(f"\nVoice generated successfully!")

if __name__ == "__main__":

    main()
コード記載場所イメージ
  1. 作成したファイルを任意のフォルダに配置
  1. PowerShellを開き、2のフォルダに移動する
  1. 以下のコマンドを実行し、関連パッケージをインストール
pip install torch transformers snac soundfile torchvision

クラウド環境への構築(Google Colaboratory)

実装した環境

Google Colaboratory

前提条件

Googleアカウントの作成

実装手順

  1. Google Colab画面にアクセスし、Googleアカウントでログインします。

https://colab.google/

  1. 画面右上の「New Notebook」をクリックし、新しいノートを作成します。
  1. メニューバーの「ランタイム」→「ランタイムのタイプを変更」を開き、ハードウェアアクセラレーションを「GPU」に設定して保存します。
ランタイムのタイプを変更のメニューイメージ
  1. Maya1の動作に必要なPythonライブラリをインストールします。

入力欄に以下のコードを入力し、実行します。

!pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu118

!pip install transformers snac
  1. Maya1の公式GitHubリポジトリまたは配布されている場所からコードを取得します。

以下のコードを実行します。

!git clone https://github.com/MayaResearch/maya1-fastapi.git
コマンド実行後にフォルダが作成されます

Maya1の活用シーン

Maya1の持つ表現力と柔軟性は、様々な分野での応用が期待されます。

スクロールできます
用途内容
ゲーム開発NPCのセリフを作る際、感情がこもった自然な音声を、コストを抑えながら大量に用意できるのは大きな魅力です。キャラクターごとに声の雰囲気を変えることで、ゲーム世界の臨場感がぐっと増します。
オーディオブック・ポッドキャスト制作登場人物それぞれに違った声質や感情を持たせられるので、聴いている人がストーリーに引き込まれやすくなります。声優を複数人雇う予算がなくても、クオリティの高い作品が作れるわけです。
インタラクティブAIアシスタントユーザーと会話するとき、ただ機械的に答えるのではなく、人間らしい感情を込めた返事ができます。これによって、使う人との距離が縮まり、親しみやすいコミュニケーションが生まれます。
動画コンテンツ制作YouTubeの解説動画などで、わざわざプロのナレーターに頼まなくても、高品質なナレーションを自動で作れます。個人クリエイターにとっては、制作コストを大幅に削減できる強い味方になるでしょう。
アクセシビリティ視覚に障がいのある方が使うスクリーンリーダーに、感情のニュアンスを加えられます。単調な読み上げではなく、抑揚のある音声で情報が伝わることで、理解しやすさが格段に向上します。
Maya1の活用シーン

なお、OpenAIの新音声合成モデル「GPT-4o Mini TTS」に関しては、下記の記事をご覧ください。

Maya1を実際に使ってみた

ローカル環境での実行(Windows OS)

まずは初期設定のまま実行した結果を紹介します。

スクロールできます
項目設定内容
声の雰囲気Realistic male voice in the 30s age with american accent. Normal pitch, warm timbre, conversational pacing.
和訳:30代の男性でアメリカ英語アクセント、音程は普通、声の質は温かみがあり、会話のようなテンポ。
出力Hello! This is Maya1 <laugh_harder> the best open source voice AI model with emotions.
和訳:こんにちは!これはMaya1です。<laugh_harder> 感情を持つ最高のオープンソース音声AIモデルです。
初回実行時設定情報
  1. 以下のコマンドで、.pyファイルを実行する
python test.py

音声データの生成が開始されます。

  1. 生成が終わるまでひたすら待つ……
初回待機画面イメージ
  1. 実行した.pyファイルと同じフォルダ内に「output.wav」という音声ファイルが生成されます。(初回実行時は、完了まで2時間近くかかりました。)

次に、内容を少し変えて実行してみました。

スクロールできます
項目設定内容
声の雰囲気Teenage female voice with a British accent, slightly high pitch, a cold and calm tone, and a pacing that feels pressuring or cornering to the listener.
和訳:10代の女性でイギリス英語アクセント、音程は高め、声の質は冷たく冷静なイメージ、相手を追い詰めるようなテンポ。
出力<angry>Why?! Why did you eat my pudding?! I was really, really looking forward to it tonight! How are you going to make up for this?!
和訳:どうして!私のプリンを食べたのですか!今日の夜を楽しみにしていたのに。この埋め合わせはどうやってしますか
2回目実行時設定情報
  1. test.pyを開き、「description」と「text」を修正します。
コード変更箇所
  1. 保存して、test.pyを実行します。
python test.py
2回目実行イメージ
  1. output.wavファイルが作成されます。(2回目以降は、5分程度で完了しました。)

クラウド環境での実行(google colaboratory)

ローカル環境での実行と同様に、初期設定のまま実行しました。

  1. 以下のコマンドで、pythonファイルを実行する。
!python transformers_inference.py
モデルのインストールが開始される

完了すると「output.wav」ファイルが生成され、ダウンロードして音声を聞くことができます。

output.wavファイルが生成される
  1. google colaboratoryでの実行時に、声の雰囲気と出力を変えたい場合は、「transformers_inference.py」ファイルの「description」と「text」を修正することで出力結果を変えることができます。
声の雰囲気と出力の変更箇所

公式のデモ環境での実行(Play Ground)

Maya Researchでは、Maya1の公式デモ環境が準備されています。

デモ環境での実行についても簡単にご紹介します。

  1. 以下のURLにアクセスします。

https://www.mayaresearch.ai/studio/text-to-speech

アクセス後の画面
  1. 右上の「Sign in」ボタンをクリックし、サインインします。
  1. 画面中央の入力欄に出力したいテキストを英語で入力します。

この時、感情については入力欄下の「Try these emotional tags:」をクリックすることで簡単に選択することができます。

入力エリアと感情表現タグ
  1. 入力欄右下の「Shuffle」ボタンで、入力欄のテキストがランダムに変更されます。
  1. 画面右下の「Generate」ボタンで、音声生成が開始されます。
Generateボタンで生成開始
  1. 画面右側に生成された音声が表示され、その場で音声を再生したり、ファイルをダウンロードすることができます。
音声が生成される

まとめ

Maya1は、自然言語による直感的な音声デザインと豊かな感情表現を実現した、オープンソース音声生成技術の画期的なプロジェクトです。商用利用可能なライセンスなので、開発者やクリエイターが自由にカスタマイズして利用することができます。

現在は英語のみの対応ですが、Hugging Faceコミュニティでは多言語対応やファインチューニングモデルの開発が進んでいるので、近い将来、日本語を利用して自由度の高い音声生成体験が可能となるかもしれません。

誰もが使える高品質なツールとして、音声AI技術の未来を加速させるでしょう。

最後に

いかがだったでしょうか?

高品質な感情音声AIを自社プロダクトへどう組み込み、コスト・ライセンス・運用リスクを抑えつつ差別化につなげるか。Maya1を前提に実装・活用戦略を具体化できます。

株式会社WEELは、自社・業務特化の効果が出るAIプロダクト開発が強みです!

開発実績として、

・新規事業室での「リサーチ」「分析」「事業計画検討」を70%自動化するAIエージェント
・社内お問い合わせの1次回答を自動化するRAG型のチャットボット
・過去事例や最新情報を加味して、10秒で記事のたたき台を作成できるAIプロダクト
・お客様からのメール対応の工数を80%削減したAIメール
・サーバーやAI PCを活用したオンプレでの生成AI活用
・生徒の感情や学習状況を踏まえ、勉強をアシストするAIアシスタント

などの開発実績がございます。

生成AIを活用したプロダクト開発の支援内容は、以下のページでも詳しくご覧いただけます。
➡︎株式会社WEELのサービスを詳しく見る。

まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。
➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

生成AIを社内で活用していきたい方へ
無料相談

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、サービス紹介資料もご用意しておりますので、併せてご確認ください。

投稿者

  • WEEL Media部

    株式会社WEELが運営する生成系AI関連メディア「生成AI Media」は、AIの専門家によるWebメディアです。 AIに特化した編集部がAIの活用方法、導入事例、ニュース、トレンド情報を発信しています。

  • URLをコピーしました!
  • URLをコピーしました!
目次