ローカル音声認識・音声合成
最終更新
LFM3-Audio-2B:1GBで聞いて話す音声モデル
書き起こしと合成を1つのモデルで
LFM3-Audio-2Bは音声とテキストを1つのモデルで扱います。書き起こし、合成、翻訳、音声対話ができ、GGUF1は1.05GBです。因果エンコーダが話している間に計算するため、最初のトークン2は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_0 | 1.05GB | mmproj Q8_0 0.34GB |
| Q4_K_M | 1.1GB | mmproj Q8_0 0.34GB |
| Q8_0 | 1.85GB | mmproj 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)
合成
合成はシステムプロンプトに言語と性別を書き、アシスタントのターンを<|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.を入れ、ツール一覧を続けます。このときはアシスタントのターンを空にし、呼び出しか音声のどちらで始めるかをモデルに選ばせます。

どこが弱いか
書き起こし精度だけを見ると専用モデルが優れます。英語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 2B | Qwen2.5-Omni 3B | Voxtral Mini 3B |
|---|---|---|---|
| 英語書き起こしWER | 6.23% | 6.30% | 5.51% |
| 合成品質UTMOSv2 | 3.83 | 3.42 | — |
| VoiceBench | 73.13 | 66.37 | 65.78 |
| 音声理解MMAR | 50.60 | 54.41 | 50.10 |
用語の注釈
GGUF — モデル情報を格納するファイル形式で、llama.cpp系のツールで広く使われます。
本文に戻るトークン — モデルが入力や出力を分けて処理する単位です。
本文に戻るBF16 — モデルの数値に使う16ビット浮動小数点形式です。指数部はFP32と同じ幅で、同程度に広い値の範囲を表せます。
本文に戻るプロンプト — モデルに送る入力文です。生成モデルでは作りたい結果を説明する文になり、出力の構成や内容を大きく左右します。
本文に戻るプリフィル — LLMが入力プロンプトを読み、各トークンの内部表現を計算する段階です。プロンプトが長いほど処理するトークンが増えます。
本文に戻るツール呼び出し — ファイル読み取り、検索、コマンド実行などの外部機能を、名前と引数でモデルが要求する形式です。実行の有無はエージェントランタイムと権限設定が決めます。
本文に戻る
よくある質問
- この記事で最初に確認すべきことは何ですか?
- LFM3-Audio-2Bは音声とテキストを1つのモデルで扱います。書き起こし、合成、翻訳、音声対話ができ、GGUFは1.05GBです。因果エンコーダが話している間に計算するため、最初のトークンは50msまで下がります。
- 必要なメモリはどのくらいですか?
- メモリは4ビットのファイルとエンコーダを合わせて1.4GB強です。8GBのMacでモデルを載せたままブラウザを開いても余ります。
