# Stable Audio

Stable Audio は、Zach Evans らによって [Stable Audio Open](https://huggingface.co/papers/2407.14358) で提案されました。テキストプロンプトを入力として受け取り、それに対応するサウンドまたは音楽サンプルを予測します。

Stable Audio Open は、テキストプロンプトから最大 47 秒の可変長ステレオオーディオを 44.1kHz で生成します。このモデルは 3 つのコンポーネントで構成されています。波形を扱いやすいシーケンス長に圧縮するオートエンコーダー、テキスト条件付けのための T5 ベースのテキスト埋め込み、そしてオートエンコーダーの潜在空間で動作する Transformer ベースの拡散（DiT）モデルです。

Stable Audioは、約48,000件の音声録音からなるコーパスで学習されています。そのうち約47,000件はFreesoundから、残りはFree Music Archive (FMA)から提供されています。すべての音声ファイルは、CC0、CC BY、またはCC Sampling+のライセンスの下で利用可能です。このデータは、autoencoderとDiTの学習に使用されます。

本論文の要旨は以下の通りです：*オープンな生成モデルはコミュニティにとって極めて重要であり、ファインチューニングを可能にし、新しいモデルを提示する際のベースラインとして機能します。しかし、現在のテキストからオーディオを生成するモデルの多くは非公開であり、アーティストや研究者がその上に構築することができません。ここでは、クリエイティブ・コモンズデータで学習された新しいオープンウェイトのテキストからオーディオを生成するモデルのアーキテクチャと学習プロセスについて説明します。評価の結果、本モデルの性能は、さまざまな指標において最先端のものと競争力があることが示されました。特に、FDopenl3の結果（生成物のリアリズムを測定する）は、44.1kHzでの高品質ステレオサウンド合成の可能性を示しています。*

このパイプラインは[Yoach Lacombe](https://huggingface.co/ylacombe)によって提供されました。元のコードベースは[Stability-AI/stable-audio-tools](https://github.com/Stability-AI/stable-audio-tools)で確認できます。

## ヒント

プロンプトを構築する際は、以下の点に注意してください。

* 説明的なプロンプト入力が最も効果的です。形容詞を使用して音の特徴を記述し（例：「高品質」や「クリア」）、可能な限りプロンプトの文脈を具体的に指定してください（例：「techno」よりも「高速ビートとシンセを備えたメロディアステクノ」の方が効果的です）。
* *ネガティブプロンプト*を使用すると、生成されるオーディオの品質を大幅に向上させることができます。「low quality, average quality」をネガティブプロンプトとして使用してみてください。

推論中:

* 生成されたオーディオサンプルの_品質_は、`num_inference_steps`引数によって制御できます。ステップ数を増やすと品質の高いオーディオが得られますが、推論速度は低下します。
* 一度に複数の波形を生成できます。`num_waveforms_per_prompt`を1より大きい値に設定すると、この機能が有効になります。生成された波形とプロンプトテキストの間に自動スコアリングが実行され、オーディオはそれに応じて最良から最悪の順にランキングされます。

## 量子化

Quantizationは、モデルの重みを低精度のデータ型で保存することで、非常に大規模なモデルのメモリ要件を軽減するのに役立ちます。ただし、動画モデルによって、Quantizationが動画の品質に与える影響は異なります。

サポートされている量子化バックエンドと、ユースケースに対応する量子化バックエンドの選択について詳しくは、[Quantization](../../quantization/overview)の概要を参照してください。以下の例では、bitsandbytesを使用して量子化された[StableAudioPipeline](/docs/diffusers/main/ja/api/pipelines/stable_audio#diffusers.StableAudioPipeline)を読み込み、推論を実行する方法を示しています。

```py
import torch
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, StableAudioDiTModel, StableAudioPipeline
from diffusers.utils import export_to_video
from transformers import BitsAndBytesConfig as BitsAndBytesConfig, T5EncoderModel

quant_config = BitsAndBytesConfig(load_in_8bit=True)
text_encoder_8bit = T5EncoderModel.from_pretrained(
    "stabilityai/stable-audio-open-1.0",
    subfolder="text_encoder",
    quantization_config=quant_config,
    dtype=torch.float16,
)

quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = StableAudioDiTModel.from_pretrained(
    "stabilityai/stable-audio-open-1.0",
    subfolder="transformer",
    quantization_config=quant_config,
    dtype=torch.float16,
)

pipeline = StableAudioPipeline.from_pretrained(
    "stabilityai/stable-audio-open-1.0",
    text_encoder=text_encoder_8bit,
    transformer=transformer_8bit,
    dtype=torch.float16,
    device_map="balanced",
)

prompt = "The sound of a hammer hitting a wooden surface."
negative_prompt = "Low quality."
audio = pipeline(
    prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=200,
    audio_end_in_s=10.0,
    num_waveforms_per_prompt=3,
    generator=generator,
).audios

output = audio[0].T.float().cpu().numpy()
sf.write("hammer.wav", output, pipeline.vae.sampling_rate)
```

## StableAudioPipeline[[diffusers.StableAudioPipeline]]

#### diffusers.StableAudioPipeline[[diffusers.StableAudioPipeline]]

```python
diffusers.StableAudioPipeline(vae: AutoencoderOobleck, text_encoder: T5EncoderModel, projection_model: StableAudioProjectionModel, tokenizer: T5Tokenizer, transformer: StableAudioDiTModel, scheduler: EDMDPMSolverMultistepScheduler)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_audio/pipeline_stable_audio.py#L78)

**パラメータ:**

vae ([AutoencoderOobleck](/docs/diffusers/main/ja/api/models/autoencoder_oobleck#diffusers.AutoencoderOobleck)) : 画像を潜在表現にエンコードし、潜在表現からデコードするための Variational Auto-Encoder (VAE) モデル。

text_encoder ([T5EncoderModel](https://huggingface.co/docs/transformers/main/en/model_doc/t5#transformers.T5EncoderModel)) : 凍結されたテキストエンコーダー。StableAudio は [T5](https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5EncoderModel) のエンコーダー、具体的には [google-t5/t5-base](https://huggingface.co/google-t5/t5-base) バリアントを使用しています。

projection_model (`StableAudioProjectionModel`) : テキストエンコーダーモデルの隠れ状態と開始・終了秒数を線形射影するために使用される学習済みモデルです。エンコーダーからの射影された隠れ状態と条件付きの秒数が連結され、transformerモデルへの入力となります。

tokenizer ([T5Tokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/t5#transformers.T5Tokenizer)) : 凍結されたテキストエンコーダー用のテキストをトークン化するトークナイザー。

transformer ([StableAudioDiTModel](/docs/diffusers/main/ja/api/models/stable_audio_transformer#diffusers.StableAudioDiTModel)) : エンコードされたオーディオの潜在変数をノイズ除去するための `StableAudioDiTModel` です。

scheduler ([EDMDPMSolverMultistepScheduler](/docs/diffusers/main/ja/api/schedulers/edm_multistep_dpm_solver#diffusers.EDMDPMSolverMultistepScheduler)) : `transformer`と組み合わせて使用し、エンコードされたオーディオの潜在変数をデノイズするためのスケジューラ。

StableAudio を使用したテキストからオーディオへの生成を行う Pipeline です。

このモデルは [DiffusionPipeline](/docs/diffusers/main/ja/api/pipelines/overview#diffusers.DiffusionPipeline) を継承しています。すべてのパイプラインに実装されている汎用的なメソッド（ダウンロード、保存、特定のデバイスでの実行など）については、スーパークラスのドキュメントを参照してください。

#### __call__[[diffusers.StableAudioPipeline.__call__]]

```python
__call__(prompt: str | list[str] = None, audio_end_in_s: float | None = None, audio_start_in_s: float | None = 0.0, num_inference_steps: int = 100, guidance_scale: float = 7.0, negative_prompt: str | list[str] | None = None, num_waveforms_per_prompt: int | None = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, initial_audio_waveforms: typing.Optional[torch.Tensor] = None, initial_audio_sampling_rate: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.LongTensor] = None, negative_attention_mask: typing.Optional[torch.LongTensor] = None, return_dict: bool = True, callback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = None, callback_steps: int | None = 1, output_type: str | None = 'pt')
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_audio/pipeline_stable_audio.py#L462)

**パラメータ:**

prompt (`str` または `list[str]`、*省略可能*) : 音声生成をガイドするためのプロンプトです。未定義の場合、`prompt_embeds` を渡す必要があります。

audio_end_in_s (`float`、*任意*、デフォルト値は 47.55) : 秒単位のオーディオ終了インデックス。

audio_start_in_s (`float`、*任意*、デフォルトは 0) : 秒単位のオーディオ開始インデックス。

num_inference_steps (`int`、*optional*、デフォルトは 100) : デノイジングのステップ数です。デノイジングのステップ数を増やすと、推論速度が遅くなる代わりに、通常、より高品質なオーディオが得られます。

guidance_scale (`float`、*optional*、デフォルト値は 7.0) : guidance scale の値を高くすると、`prompt` のテキストと密接に関連するオーディオを生成するようモデルに促されますが、その代わりとして音質が低下します。`guidance_scale > 1` の場合に guidance scale が有効になります。

negative_prompt (`str` または `list[str]`、*省略可*) : 音声生成において含めるべきでない内容を指示するためのプロンプトです。未定義の場合、代わりに `negative_prompt_embeds` を渡す必要があります。guidance を使用していない場合（`guidance_scale < 1`）は無視されます。

num_waveforms_per_prompt (`int`、*optional*、デフォルトは 1) : プロンプトごとに生成する波形の数を指定します。

eta (`float`、*任意*、デフォルト値は 0.0) : [DDIM](https://huggingface.co/papers/2010.02502)論文のパラメータ eta (η) に対応します。[DDIMScheduler](/docs/diffusers/main/ja/api/schedulers/ddim#diffusers.DDIMScheduler)でのみ適用され、他のスケジューラーでは無視されます。

generator (`torch.Generator` または `list[torch.Generator]`、*任意*) : 生成を決定論的にするための [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html)。

latents (`torch.Tensor`, *任意*) : 音声生成の入力として使用する、ガウス分布からサンプリングされた事前生成されたノイジー・ラテンツ。異なるプロンプトで同じ生成を調整するために使用できます。指定されない場合、指定されたランダムな`generator`を使用してサンプリングを行い、ラテンツのテンソルが生成されます。

initial_audio_waveforms (`torch.Tensor`, *任意*) : 生成の初期音声波形として使用する、任意の初期音声波形。形状は `(batch_size, num_channels, audio_length)` または `(batch_size, audio_length)` である必要があります。ここで `batch_size` は、モデルに渡されるプロンプトの数に対応します。

initial_audio_sampling_rate (`int`, *任意*) : `initial_audio_waveforms` が提供されている場合のサンプリングレートです。モデルのものと一致する必要があります。

prompt_embeds (`torch.Tensor`, *任意*) : テキストエンコーダーモデルによって事前計算されたテキスト埋め込み。プロンプトの重み付けなど、*例えば*テキスト入力の調整を容易に行うことができます。指定されない場合、`prompt` 入力引数からテキスト埋め込みが計算されます。

negative_prompt_embeds (`torch.Tensor`, *任意*) : テキストエンコーダーモデルから事前計算されたネガティブなテキスト埋め込み。プロンプトの重み付けなど、*例えば*テキスト入力の調整を簡単に実行できます。指定されない場合、`negative_prompt` 入力引数から negative_prompt_embeds が計算されます。

attention_mask (`torch.LongTensor`, *任意*) : `prompt_embeds` に適用する事前計算済みのアテンションマスクです。指定しない場合、`prompt` 入力引数からアテンションマスクが計算されます。

negative_attention_mask (`torch.LongTensor`, *任意*) : `negative_text_audio_duration_embeds` に適用する事前計算済みのアテンションマスク。

return_dict (`bool`、*任意*、デフォルトは`True`) : プレーンなタプルではなく、[StableDiffusionPipelineOutput](/docs/diffusers/main/ja/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput)を返すかどうか。

callback (`Callable`、*任意*) : 推論中に`callback_steps`ステップごとに呼び出される関数です。この関数は、以下の引数とともに呼び出されます: `callback(step: int, timestep: int, latents: torch.Tensor)`。

callback_steps (`int`、*optional*、デフォルトは 1) : `callback` 関数が呼び出される頻度です。指定しない場合、callback はすべてのステップで呼び出されます。

output_type (`str`、*任意*、デフォルトは `"pt"`) : 生成されたオーディオの出力形式です。`"np"` を指定すると NumPy の `np.ndarray` を返し、`"pt"` を指定すると PyTorch の `torch.Tensor` オブジェクトを返します。`"latent"` を指定すると、潜在拡散モデル (LDM) の出力を返します。

**戻り値:** [StableDiffusionPipelineOutput](/docs/diffusers/main/ja/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) または `tuple`

`return_dict` が `True` の場合、[StableDiffusionPipelineOutput](/docs/diffusers/main/ja/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) が返され、それ以外の場合は、最初の要素が生成されたオーディオを含むリストである `tuple` が返されます。

生成用の pipeline への呼び出し関数。

例:
```py
>>> import scipy
>>> import torch
>>> import soundfile as sf
>>> from diffusers import StableAudioPipeline

>>> repo_id = "stabilityai/stable-audio-open-1.0"
>>> pipe = StableAudioPipeline.from_pretrained(repo_id, torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")

>>> # define the prompts
>>> prompt = "The sound of a hammer hitting a wooden surface."
>>> negative_prompt = "Low quality."

>>> # set the seed for generator
>>> generator = torch.Generator("cuda").manual_seed(0)

>>> # run the generation
>>> audio = pipe(
...     prompt,
...     negative_prompt=negative_prompt,
...     num_inference_steps=200,
...     audio_end_in_s=10.0,
...     num_waveforms_per_prompt=3,
...     generator=generator,
... ).audios

>>> output = audio[0].T.float().cpu().numpy()
>>> sf.write("hammer.wav", output, pipe.vae.sampling_rate)
```

