Liquid AI

🇯🇵 LFM2.5-Audio-1.5B-JP

Liquid AI

LFM2.5-Audio-1.5B-JP is Liquid AI's first Japanese capable audio model and the first Japanese speech-to-speech model at this lightweight scale built from the foundations of LFM2.5-Audio-1.5B.

LFM2.5-Audio-1.5B-JP is an end-to-end multimodal speech and text language model, and as such does not require separate ASR and TTS components. Designed with low latency and real time conversation in mind, at only 1.5 billion parameters LFM2.5-Audio-JP enables seamless Japanese conversational interaction, achieving capabilities on par with much larger models. Our model consists of a pretrained LFM2.5 model as its multimodal backbone, along with a FastConformer based audio encoder to handle continuous audio inputs, and an RQ-transformer generating discrete tokens coupled with a lightweight audio detokenizer for audio output.

LFM2.5-Audio-JP supports two distinct generation routines, each suitable for a set of tasks. Interleaved generation enables real-time speech-to-speech conversational chatbot capabilities, where audio generation latency is key. Sequential generation is suited for non-conversational tasks such as ASR or TTS, and allows the model to switch generated modality on the fly.

LFM2.5-Audio-1.5B-JPは、Liquid AI初となる日本語対応の音声モデルであり、LFM2.5-Audio-1.5Bの基盤から構築された、この軽量な規模においては初となる日本語のSpeech-to-Speechモデルです。

LFM2.5-Audio-1.5B-JPは、エンドツーエンドのマルチモーダルな音声・テキスト言語モデルであり、そのため独立したASR(自動音声認識)やTTS(音声合成)のコンポーネントを必要としません。低遅延とリアルタイムな会話を念頭に設計されたLFM2.5-Audio-JPは、わずか15億(1.5B)パラメータでありながら、シームレスな日本語の対話インタラクションを可能にし、より大規模なモデルに匹敵する能力を実現しています。 当社のモデルは、マルチモーダルのバックボーン(基盤)として事前学習済みのLFM2.5モデルで構成されており、それに加えて、連続的な音声入力を処理するFastConformerベースの音声エンコーダー、離散トークンを生成するRQ-transformer、そして音声出力用の軽量な音声デトークナイザーが組み合わされています。

LFM2.5-Audio-JPは、それぞれ異なるタスクに適した2つの生成ルーティン(方式)をサポートしています。「インターリーブド(交互)生成」は、音声生成の遅延(レイテンシー)が重要となる、リアルタイムの音声対話チャットボット機能を可能にします。「シーケンシャル(逐次)生成」は、ASRやTTSなどの非対話的なタスクに適しており、モデルが生成するモダリティ(音声かテキストか)をその場で動的に切り替えることができます。

📈 Performance

VoiceBench1 (Audio Input)

Liquid AI

We use GPT-4o as an LLM-as-a-judge and report the highest score assigned to each sample. Elyza and spoken_Elyza are scored on a 0–5 scale, while M-ifeval is scored on a 0–1 scale. Average performance was computed after rescaling all benchmark scores to a 0–5 scale.

Model Size Elyza spoken_Elyza M-ifeval
LFM2.5-Audio-1.5B-JP 1.5B 2.272 2.118 0.143
Qwen2.5-Omni-3B 5.5B 2.365 2.094 0.137
LLM-jp-Moshi-v1 7.7B 1.000 1.023 0.110
J-Moshi 7.7B 1.034 1.012 0.151

1 Dataset is derived from sbintuitions/voicebench-ja.

ASR2

We evaluated character error rate (CER) on three ASR datasets.

Model CommonVoice 8 (Japanese test set.) JSUT Basic 5000 ReazonSpeech (held-out test set)
LFM2.5-Audio-1.5B-JP 4.42 8.07 24.24
reazon-research/reazonspeech-nemo-v2 9.1 7.4 11.2
japanese-asr/distil-whisper-large-v3-ja-reazonspeech-all 9.2 8.4 11.6
japanese-asr/distil-whisper-large-v3-ja-reazonspeech-large 9.4 8.5 12.2
japanese-asr/distil-whisper-large-v3-ja-reazonspeech-medium 10.9 11.3 14.8
japanese-asr/distil-whisper-large-v3-ja-reazonspeech-small 30.2 39 40.7
japanese-asr/distil-whisper-large-v3-ja-reazonspeech-tiny 94.8 96.3 96.7
openai/whisper-large-v3 8.5 7.1 14.9
openai/whisper-large-v2 9.7 8.2 28.1
openai/whisper-large 10 8.9 34.1
openai/whisper-medium 11.5 10 33.2
openai/whisper-base 28.6 24.9 70.4
openai/whisper-small 15.1 14.2 41.5
openai/whisper-tiny 53.7 36.5 137.9

2 Results are derived from japanese-asr.

📄 Model details

Property
Parameters (LM only) 1.2B
Audio encoder FastConformer (115M, canary-180m-flash)
Backbone layers hybrid conv+attention
Audio tokenizer Mimi, using 8 codebooks
Context 32,768 tokens
Vocab size 65,536 (text) / 2049*8 (audio)
Precision bfloat16
License LFM Open License v1.0

Supported languages: Japanese

🏃 How to run LFM2.5-Audio-JP

Install the liquid-audio package via pip

pip install liquid-audio
pip install "liquid-audio [demo]" # optional, to install demo dependencies
pip install flash-attn --no-build-isolation  # optional, to use flash attention 2. Will fallback to torch SDPA if not installed

Multi-turn, multi-modal chat

The liquid-audio library provides a lower lever interface to the model and generation routines, ideal for custom usecases. We demonstrate this with a simple multi-turn chat, where the first turn is given as audio, and the second turn is given as text.

For multi-turn chat with text and audio output, we use interleaved generation. The system prompt should be set to Respond with interleaved text and audio.. Here we use audio as the first user turn, and text as the second one.

import torch
import soundfile as sf
from liquid_audio import LFM2AudioModel, LFM2AudioProcessor, ChatState, LFMModality

# Load models
HF_REPO = "LiquidAI/LFM2.5-Audio-1.5B-JP"

processor = LFM2AudioProcessor.from_pretrained(HF_REPO).eval()
model = LFM2AudioModel.from_pretrained(HF_REPO).eval()

# Set up inputs for the model
chat = ChatState(processor)

chat.new_turn("system")
chat.add_text("Respond with interleaved text and audio.")
chat.end_turn()

chat.new_turn("user")
wav, sampling_rate = sf.read("assets/question_jp.wav", dtype="float32")
wav = torch.from_numpy(wav).unsqueeze(0)
chat.add_audio(wav, sampling_rate)
chat.end_turn()

chat.new_turn("assistant")

# Generate text and audio tokens.
text_out: list[torch.Tensor] = []
audio_out: list[torch.Tensor] = []
modality_out: list[LFMModality] = []
for t in model.generate_interleaved(**chat, max_new_tokens=512, audio_temperature=1.0, audio_top_k=4):
    if t.numel() == 1:
        print(processor.text.decode(t), end="", flush=True)
        text_out.append(t)
        modality_out.append(LFMModality.TEXT)
    else:
        audio_out.append(t)
        modality_out.append(LFMModality.AUDIO_OUT)

# output: こんにちは。私はリキッドリリーと申します。質問に答えたり、アドバイスを提供したりするためのAIボイスアシスタントです。リアルタイムでさまざまな言語タスクをお手伝いするよう設計されています。

# Detokenize audio, removing the last "end-of-audio" codes
# Mimi returns audio at 24kHz
audio_codes = torch.stack(audio_out[:-1], 1).unsqueeze(0)
waveform = processor.decode(audio_codes)
sf.write("answer_jp1.wav", waveform.cpu()[0], 24_000)

# Append newly generated tokens to chat history
chat.append(
    text = torch.stack(text_out, 1),
    audio_out = torch.stack(audio_out, 1),
    modality_flag = torch.tensor(modality_out),
)
chat.end_turn()

# Start new turn
chat.new_turn("user")
chat.add_text("富士山の高さは何メートルですか。")
chat.end_turn()

chat.new_turn("assistant")

# Generate second turn text and audio tokens.
audio_out: list[torch.Tensor] = []
for t in model.generate_interleaved(**chat, max_new_tokens=512, audio_temperature=1.0, audio_top_k=4):
    if t.numel() == 1:
        print(processor.text.decode(t), end="", flush=True)
    else:
        audio_out.append(t)

# output: 富士山の高さは約3,776メートルです。

# Detokenize second turn audio, removing the last "end-of-audio" codes
audio_codes = torch.stack(audio_out[:-1], 1).unsqueeze(0)
waveform = processor.decode(audio_codes)
sf.write("answer_jp2.wav", waveform.cpu()[0], 24_000)

ASR

For ASR, we use sequential generation, with the fixed system prompt Perform ASR in japanese..

import torch
import soundfile as sf
from liquid_audio import LFM2AudioModel, LFM2AudioProcessor, ChatState, LFMModality

# Load models
HF_REPO = "LiquidAI/LFM2.5-Audio-1.5B-JP"

processor = LFM2AudioProcessor.from_pretrained(HF_REPO).eval()
model = LFM2AudioModel.from_pretrained(HF_REPO).eval()

# Set up inputs for the model
chat = ChatState(processor)

chat.new_turn("system")
chat.add_text("Perform ASR in japanese.")
chat.end_turn()

chat.new_turn("user")
wav, sampling_rate = sf.read("assets/asr_jp.wav", dtype="float32")
wav = torch.from_numpy(wav).unsqueeze(0)
chat.add_audio(wav, sampling_rate)
chat.end_turn()

chat.new_turn("assistant")

# Generate text
for t in model.generate_sequential(**chat, max_new_tokens=512):
    if t.numel() == 1:
        print(processor.text.decode(t), end="", flush=True)

# Output: この度は弊社の確認不足により多大なご迷惑をおかけしましたことを深くお詫び申し上げます。今後はこのようなことが二度と起こらないよう社内のチェック体制を徹底してまいります。

TTS

For TTS, we also use sequential generation, with the fixed system prompt Perform TTS in japanese..

import torch
import soundfile as sf
from liquid_audio import LFM2AudioModel, LFM2AudioProcessor, ChatState, LFMModality

# Load models
HF_REPO = "LiquidAI/LFM2.5-Audio-1.5B-JP"

processor = LFM2AudioProcessor.from_pretrained(HF_REPO).eval()
model = LFM2AudioModel.from_pretrained(HF_REPO).eval()

# Set up inputs for the model
chat = ChatState(processor)

chat.new_turn("system")
chat.add_text("Perform TTS in japanese.")
chat.end_turn()

chat.new_turn("user")
chat.add_text("先週ご相談いただいた新しいプロジェクトの件ですが、社内で検討した結果、ぜひ前向きに進めさせていただきたいと考えております。つきましては、具体的なスケジュールについて一度お打ち合わせの機会をいただけますでしょうか。")
chat.end_turn()

chat.new_turn("assistant")

# Generate text
audio_out: list[torch.Tensor] = []
for t in model.generate_sequential(**chat, max_new_tokens=512, audio_temperature = 0.8, audio_top_k=64):
    if t.numel() > 1:
        audio_out.append(t)

# Detokenize audio
audio_codes = torch.stack(audio_out[:-1], 1).unsqueeze(0)
waveform = processor.decode(audio_codes)
sf.write("tts_jp.wav", waveform.cpu()[0], 24_000)

Output Samples

Multi-turn, multi-modal chat

UserAssistant

ASR

InputOutput
本日はお忙しい中貴重なお時間をいただき誠にありがとうございました。皆様からいただいた貴重なご意見を元に次回の会議までに提案内容をさらにブラッシュアップしてまいります。
先週ご相談いただいた新しいプロジェクトの件ですが、社内で検討した結果、ぜひ前向きに進めさせていただきたいと考えております。つきましては、具体的なスケジュールについて一度お打ち合わせの機会をいただけますでしょうか。
お世話になっております。先ほどお送りいたしました企画書につきまして、一部データの修正を行いましたので、最新版を添付にて再送いたします。お手数をおかけしますが、ご確認のほどよろしくお願いいたします。
昨日は突然のスケジュール変更にもかかわらず迅速にご対応いただき本当に助かりました。おかげさまで無事に期限内に資料を提出することができました。心より感謝申し上げます。
この度は弊社の確認不足により多大なご迷惑をおかけしましたことを深くお詫び申し上げます。今後はこのようなことが二度と起こらないよう社内のチェック体制を徹底してまいります。

TTS

InputOutput
本日はお忙しい中貴重なお時間をいただき誠にありがとうございました。皆様からいただいた貴重なご意見を元に次回の会議までに提案内容をさらにブラッシュアップしてまいります。
先週ご相談いただいた新しいプロジェクトの件ですが、社内で検討した結果、ぜひ前向きに進めさせていただきたいと考えております。つきましては、具体的なスケジュールについて一度お打ち合わせの機会をいただけますでしょうか。
お世話になっております。先ほどお送りいたしました企画書につきまして、一部データの修正を行いましたので、最新版を添付にて再送いたします。お手数をおかけしますが、ご確認のほどよろしくお願いいたします。
昨日は突然のスケジュール変更にもかかわらず迅速にご対応いただき本当に助かりました。おかげさまで無事に期限内に資料を提出することができました。心より感謝申し上げます。
この度は弊社の確認不足により多大なご迷惑をおかけしましたことを深くお詫び申し上げます。今後はこのようなことが二度と起こらないよう社内のチェック体制を徹底してまいります。

Finetuning

To finetune on your own data, make use of the ChatMessage interface. This requires you to:

  1. map your raw dataset rows into list[ChatMessage]
  2. use the LFM2AudioChatMapper to create a preprocessed dataset
  3. train a model from the preprocessed dataset with LFM2DataLoader

To finetune our Japanese model on your own data in interleaved generation mode, instantiate the LFM2AudioChatMapper class with interleaved_text_tokens=6 and interleaved_audio_tokens=9. These values reflect the predefined Japanese interleaving ratio of 6 text tokens to 9 audio tokens, based on tokenization statistics.

📬 Contact

License

The code in this the package repository and associated weights are licensed under the LFM Open License v1.0.

The code for the audio encoder is based on Nvidia NeMo, licensed under Apache 2.0, and the canary-180m-flash checkpoint, licensed under CC-BY 4.0. To simplify dependency resolution, we also ship the Python code of Kyutai Mimi, licensed under the MIT License. We also redistribute weights for Kyutai Mimi, licensed under CC-BY-4.0.

Citation

@article{liquidai2025lfm2,
 title={LFM2 Technical Report},
 author={Liquid AI},
 journal={arXiv preprint arXiv:2511.23404},
 year={2025}
}
Downloads last month
16
Safetensors
Model size
1B params
Tensor type
I64
·
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for LiquidAI/LFM2.5-Audio-1.5B-JP

Finetuned
(5)
this model
Quantizations
1 model

Collections including LiquidAI/LFM2.5-Audio-1.5B-JP

Paper for LiquidAI/LFM2.5-Audio-1.5B-JP