ローカル音声認識・音声合成

LFM3-Audio-2B:1GBで聞いて話す音声モデル

書き起こしと合成を1つのモデルで

LFM3-Audio-2Bは音声とテキストを1つのモデルで扱います。書き起こし、合成、翻訳、音声対話ができ、GGUF1は1.05GBです。因果エンコーダが話している間に計算するため、最初のトークン2は50msまで下がります。

実行条件と要点
  • GGUFは1.05GB、エンコーダは0.34GBです。
  • 韓国語を含む18言語を扱います。
  • 話している間に計算し、最初のトークンが50msまで下がります。
  • 書き起こし精度は専用モデルに劣ります。

聞いて話す2B

入力はテキストか16kHzの音声、出力はテキストか24kHzの音声です。両方を混ぜられるので、声で答えながら画面には文字を残せます。

独自の音声エンコーダとLiquidCodecトークナイザを使います。エンコーダが完全な因果構造なので、話している間にも先に計算でき、これが低遅延の要です。

音声は80msが12トークンに圧縮されます。32Kを音声だけで埋めると3分強なので、長い会議は区切って入れます。

モデル概要
モデル項目設定値
入力テキスト、16kHz音声
出力テキスト、24kHz音声
コンテキスト32Kトークン
音声言語韓国語を含む18
ライセンスLFM Open License v1.0

ファイルとメモリ

GGUFはQ4_0で1.05GB、Q4_K_Mで1.1GB、Q8_0で1.85GBです。これに音声エンコーダのmmprojがQ8_0で0.34GB加わります。

メモリは4ビットのファイルとエンコーダを合わせて1.4GB強です。8GBのMacでモデルを載せたままブラウザを開いても余ります。

PythonでTransformersから読み込むとbf163の重みが4GBです。1.4GBはGGUFとエンコーダをllama.cppで載せるときの数字なので、二つの経路を混ぜるとメモリ計算がずれます。

ダウンロードするファイル
ファイル名ファイルサイズ同時に取得するエンコーダ
Q4_01.05GBmmproj Q8_0 0.34GB
Q4_K_M1.1GBmmproj Q8_0 0.34GB
Q8_01.85GBmmproj Q8_0 0.34GB

文字起こし

システムプロンプト4にPerform ASR in Korean.のように言語を書くとその言語で書き起こします。言語を省いてPerform ASR.だけならモデルが推論します。

リアルタイム書き起こしはまだ英語のみです。0.96秒のチャンクで入れると話している間に文字が出て、30秒を超えたらテキスト文脈を開き直します。

録音ファイルを一括で入れる方式とリアルタイムストリームではコードが違います。リアルタイム側は状態を次の呼び出しに渡し、チャンクごとに結果を受け取ります。

書き起こしコード
from transformers import AutoModelForMultimodalLM, AutoProcessor

model_id = "LiquidAI/LFM3-Audio-2B"
model = AutoModelForMultimodalLM.from_pretrained(
    model_id, trust_remote_code=True).eval()
processor = AutoProcessor.from_pretrained(
    model_id, trust_remote_code=True)

conversation = [
    {"role": "system", "content": "Perform ASR in Korean."},
    {"role": "user", "content": [{"type": "audio", "audio": "meeting.wav"}]},
]
inputs = processor.apply_chat_template(
    conversation, add_generation_prompt=True,
    tokenize=True, return_dict=True, return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=1024,
    suppress_mixed=True, suppress_audio_out=True,
    return_dict_in_generate=True)
text = processor.decode(
    out.sequences[0, inputs["input_ids"].shape[1]:],
    skip_special_tokens=True)
print(text)
ノートPC、マイク、ノートが置かれた会議テーブル
会議を録音しておけば書き起こしは一括で終わります。リアルタイムが必要なら言語の制約を先に確認します。

合成

合成はシステムプロンプトに言語と性別を書き、アシスタントのターンを<|audio_start|>で埋めます。Perform TTS in American English using a female voice.のような形です。

サンプリングはaudio_temperature 1.0、audio_top_k 128、繰り返しペナルティ1.1、窓4096を使います。テキストだけならsuppress_mixedとsuppress_audio_outを有効にします。

合成コード
import soundfile as sf

codec = processor.audio_tokenizer.eval()

conversation = [
    {"role": "system", "content": "Perform TTS in Korean using a female voice."},
    {"role": "user", "content": "오늘 회의는 세 시에 시작합니다."},
    {"role": "assistant", "content": "<|audio_start|>"},
]
inputs = processor.apply_chat_template(
    conversation, continue_final_message=True,
    tokenize=True, return_dict=True, return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=256,
    audio_temperature=1.0, audio_top_k=128,
    audio_repetition_penalty=1.1, audio_repetition_window=4096,
    return_dict_in_generate=True)
waveform = codec.decode(
    out.audio_codes[:1, :, :out.audio_lengths[0]]).audio_values[0]
sf.write("tts.wav", waveform.float().cpu().numpy(), 24_000)
二つの音声トラックを表示した画面とオーディオインターフェース、ヘッドホン
合成品質は表より耳で分かれます。同じ文を自分の録音と交互に聴いてください。

遅延

因果エンコーダが話している間にプリフィル5するため、話し終えてから待つ時間が減ります。最初のトークンは50msまで下がります。

LiquidCodecはM4 MaxのCPU1スレッドで実時間の87倍の速さで音声を作ります。80msを12トークンに圧縮し並列に予測するため、生成と再生が重なります。

音声で対話し、道具を呼びます

声で尋ねるとテキストと音声を一緒に返します。ストリーミングなので文が終わる前に音が出始めます。

話した依頼をツール呼び出し6に変えられます。照明を消してという言葉が構造化された呼び出しになり、結果をまた音声で読み上げます。

ツールの結果が長いとその分読み上げが増えます。回答を短く促すシステムプロンプトが遅延に直接効きます。

ツールを繋ぐときはシステムプロンプトにRespond with function calls, and interleaved text and audio.を入れ、ツール一覧を続けます。このときはアシスタントのターンを空にし、呼び出しか音声のどちらで始めるかをモデルに選ばせます。

棚にMac mini、ヘッドホン、外付けドライブ、書類フォルダが整理されて置かれた図
モデル1GBとエンコーダ0.34GBなら小さなMacでも音声パイプラインが動きます。

どこが弱いか

書き起こし精度だけを見ると専用モデルが優れます。英語WERは6.23%で、Voxtral Mini 3Bの5.51%より高いです。

ツール呼び出し58.50はGemma 4 E4Bの72.40より低く、音声理解50.60はQwen2.5-Omni 3Bの54.41より低いです。

代わりにVoiceBench 73.13と合成品質3.83は比較モデルより高いです。1つのモデルで聞く・話すを担う流れに価値があります。

左右にスクロールして各項目を比較できます。

モデルカードの比較
指標LFM3-Audio 2BQwen2.5-Omni 3BVoxtral Mini 3B
英語書き起こしWER6.23%6.30%5.51%
合成品質UTMOSv23.833.42—
VoiceBench73.1366.3765.78
音声理解MMAR50.6054.4150.10

用語の注釈

  1. GGUF — モデル情報を格納するファイル形式で、llama.cpp系のツールで広く使われます。

    本文に戻る
  2. トークン — モデルが入力や出力を分けて処理する単位です。

    本文に戻る
  3. BF16 — モデルの数値に使う16ビット浮動小数点形式です。指数部はFP32と同じ幅で、同程度に広い値の範囲を表せます。

    本文に戻る
  4. プロンプト — モデルに送る入力文です。生成モデルでは作りたい結果を説明する文になり、出力の構成や内容を大きく左右します。

    本文に戻る
  5. プリフィル — LLMが入力プロンプトを読み、各トークンの内部表現を計算する段階です。プロンプトが長いほど処理するトークンが増えます。

    本文に戻る
  6. ツール呼び出し — ファイル読み取り、検索、コマンド実行などの外部機能を、名前と引数でモデルが要求する形式です。実行の有無はエージェントランタイムと権限設定が決めます。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
LFM3-Audio-2Bは音声とテキストを1つのモデルで扱います。書き起こし、合成、翻訳、音声対話ができ、GGUFは1.05GBです。因果エンコーダが話している間に計算するため、最初のトークンは50msまで下がります。
必要なメモリはどのくらいですか?
メモリは4ビットのファイルとエンコーダを合わせて1.4GB強です。8GBのMacでモデルを載せたままブラウザを開いても余ります。