0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LFM Audio を動かしてみた ── マルチモーダル音声対話の可能性と現実

0
Posted at

はじめに

私は機械知能研究室に所属し,CV分野の研究に取り組んでいます.機械知能研究室では,ロボットの視覚機能や,自律的に行動するための知能システムに関する研究が行われています.
研究室の詳細は以下をご覧ください.

HPはこちら


LiquidAI が公開した LFM2.5-Audio-1.5B-JP(以下 LFM Audio)は,テキストと音声を統合したマルチモーダル言語モデルです.
音声を入力として直接理解し,テキストと音声を同時に出力できるという,これまでの「ASR → LLM → TTS」という3段構成を1モデルで実現できる点が大きな特徴です.

本記事では実際に動かしてみた結果と,うまくいかなかった点の考察をまとめます.


LFM Audio の主要機能

LFM Audio が1つのモデルで担える機能は大きく3つあります.

機能 概要
ASR(音声認識) 音声を入力しテキストで出力.Whisperなどの外部モデル不要
TTS(音声合成) テキストを入力し音声コードで出力.感情豊かな発話が得意
マルチモーダル対話 音声入力 → テキスト + 音声の同時出力.真の音声対話

モデルの呼び出し方はシンプルで,generate_interleaved() という1つのメソッドが3機能すべてを担います.テキストトークン(numel=1)と音声トークン(numel=8)を交互に生成し,システムプロンプトや入力の種類によって動作が変わります.

from liquid_audio import LFM2AudioModel, LFM2AudioProcessor, ChatState

processor = LFM2AudioProcessor.from_pretrained("LiquidAI/LFM2.5-Audio-1.5B-JP", device="cuda").eval()
model     = LFM2AudioModel.from_pretrained("LiquidAI/LFM2.5-Audio-1.5B-JP", device="cuda").eval()

state = ChatState(processor)
state.new_turn("system"); state.add_text("あなたは文字起こしアシスタントです."); state.end_turn()
state.new_turn("user");   state.add_audio(wav_tensor, 16000); state.end_turn()
state.new_turn("assistant")

for token in model.generate_interleaved(**state, max_new_tokens=512):
    # テキストと音声が混ざった出力を順番に処理する
    if token.numel() == 1:   # テキストトークン
        print(processor.text.decode(token), end="", flush=True)
    elif token.numel() == 8: # 音声トークン
        audio_codes.append(token)

動かした内容

今回試したのは以下の3種類です.

1. ASR(音声認識)

Whisperを使わず,LFM Audio の音声理解能力だけで文字起こしを行いました.

音声ファイル → LFM Audio → テキスト(ストリーミング表示)

ポイント:

  • audio_top_k=1 を設定して音声トークンの生成を最小限に抑えることで,ASRに専念させる
  • テキストトークンが生成されるたびに即座に表示されるため,体感遅延が短い

2. TTS(音声合成)

音声 → Whisper(ASR)→ Ollama/Gemma(返答生成)→ LFM Audio(TTS)→ 音声

LFM の役割を TTS に限定することで安定性を確保した構成です.
Qwen3/Gemma4 が会話の文脈を管理し,LFM が感情豊かな音声を生成します.

3. マルチモーダル対話

マイク → VAD → LFM Audio(ASR + 対話 + TTS)→ スピーカー

PyAudio でマイクから生の声をリアルタイムに録音し,無音検出(VAD)で発話を区切り,LFM 1モデルだけで音声対話を試みました.
(※マイクからの音声ストリームを垂れ流すのではなく,VADを用いて「話し終わった」タイミングを検知してからモデルに渡す手法は,Siriやスマートスピーカーなどでも用いられる音声対話の標準的なアプローチです.)


動作結果と考察

うまくいった点

TTS は安定して動作した

TTS 用途では,感情豊かな自然な音声を安定して生成できました.
音声コード(8トークン単位)をデコードしながら PyAudio でストリーミング再生することで,生成しながら再生する低遅延な実装も実現できました.

ASR はファイル入力では動作した

音声ファイルを入力として与えた場合は,それなりに認識できていました.
audio_top_k=1 で音声トークンの多様性をゼロにするのが安定動作の鍵です.


うまくいかなかった点

問題1:ASR がリアルタイム短音声で激しくハルシネーション

リアルタイムでマイクから録音して試した際の認識結果(実際の出力そのまま):

話した内容:「こんにちは,私は大学院生です」
認識結果:
「あなた: こんにちは,私は状赤血球血性にあう大学院生です.
あなた: 私は大学院の学生です アイデアを共有し紧密合作を重視斯科学生です

実際の発話は「こんにちは,私は大学院生です」程度にもかかわらず,中国語文字(紧密合作)や文字化け(��),存在しない病名が出力されました.

考察:

  • LFM Audio の ASR は長めの音声(数十秒以上)の文字起こしを想定している可能性
  • マイクからのリアルタイム短音声(1〜3秒)には適していない可能性
  • Whisper が専用の音声エンコーダを持つのに対し,LFM は言語モデル側で音声を処理するため,ノイズや短音声への耐性が弱い可能性がある

問題2:マルチターン会話が完全に破綻

自分👦 「こんにちは,私は大学院生です」
LFM🤖 「こんにちは.私は頑固な猫です.借金のことは,猫の時間に考えて」

自分👦 「いいえ違います,私は大学院生です」
LFM🤖 「おはようございます.私は猫です.借金の アイデアは,猫ずかしいです」

自分👦 「いいえ違います,私は大学院生です」
LFM🤖 「私は猫です.人間の夫で,魚のメモを らしたことがあります」

自分👦 「私は大学院生です」
LFM🤖 「猫です,あなたは.双葉です.魚で,魚です.」

ユーザーが「私は猫ではない,人間だ」と明示的に否定しても,LFM は「猫です」と言い続けました.
会話の文脈がまったく維持できていません.

考察:

  1. テキストと音声の順序情報の喪失
    会話の履歴を保持する際,テキストと音声の順番を正確にモデルに伝える必要があります.この情報の管理が難しく,順序が崩れることで文脈が破綻したと考えられます.

  2. LFM Audio のマルチターン対話の限界
    LFM Audio は「1回の音声入出力」を高品質にこなすために設計されており,GPT-4 や Qwen のようなチャット特化型 LLM と比べてマルチターン対話の能力が弱い可能性があります.

  3. 入力音声のハルシネーションが連鎖
    ASR 自体が「借金」「猫」などの誤ったテキストを生成してしまい,それが会話履歴に蓄積されることで,次のターンもおかしな内容が生成される悪循環に陥っていると考えられます.


実用的な使い方の結論

試した結果,LFM Audio の現状での 最適な使い方は以下の構成です.

🎤 マイク
  ↓ VAD(無音検出)
  Whisper(ASR) ← 安定した音声認識はWhisperに任せる
  ↓
  Qwen3 / Gemma(via Ollama)← 会話・文脈管理はLLMに任せる
  ↓
  LFM Audio(TTS) ← LFMは「声を出す」ことに専念させる
  ↓
🔊 スピーカー(ストリーミング再生)

LFM Audio は TTS エンジンとして使ったときが最も安定しており,標準的な TTS より感情表現が豊かでした.
ASR やマルチターン対話への単独利用は,現時点では実用には至りませんでした.


環境メモ

項目 詳細
GPU NVIDIA(CUDA利用)
モデル LiquidAI/LFM2.5-Audio-1.5B-JP
依存 liquid_audio, torch, torchaudio, gradio, pyaudio
音声I/O PulseAudio経由(ALSA direct は認識されず)

PyAudio は Anaconda 環境の libasound がシステムの ALSA プラグインと干渉するため,以下のシンボリックリンクが必要でした.

mkdir -p ~/anaconda3/lib/alsa-lib
ln -sf /usr/lib/x86_64-linux-gnu/alsa-lib/libasound_module_pcm_pulse.so \
       ~/anaconda3/lib/alsa-lib/libasound_module_pcm_pulse.so

おわりに

LFM Audio は今回はうまく行きませんでしたが「1モデルで音声・テキストをまとめて扱える」という面白いコンセプトを持つモデルです.

一方でリアルタイム ASR やマルチターン対話は現状では厳しく,実用的な音声対話システムを組む場合は「Whisper(ASR)+ LLM(対話)+ LFM(TTS)」というハイブリッド構成が現実的な選択肢です.

今後モデルの改良が進めば,LFM 1本で完結する音声対話が実現できるかもしれません.引き続き試していきたいと思います.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?