目次
背景
- 音声系技術を実装した時のメモ
- 次のようなシステムを実装していた
- LLMで会話
- TTSのFT
- ASR作成
- VAD作成
- 記憶がフレッシュなうちに備忘録として残す
- 特に音周りの技術は初めてだったので、用語を整理した
用語 / 技術
会話の組み立て
- LLM
- Large Language Model
- 膨大なテキストデータを学習し、人間のように自然な文章を生成・理解するAI技術
- Llama.cpp
- Gemma4をサーバー化するのに使用
- https://github.com/ggml-org/llama.cpp
- Gemma 4
- Googleが開発した2026年4月時点で最新のEdge LLM
- 今回は、量子化されたQ4_K_M.ggufを使用
- https://huggingface.co/unsloth/gemma-4-E2B-it-GGUF
音声発話
- TTS
- Text to Speech
- テキストを音声に変換する技術
- piper-plus
- 高速・高品質なニューラルテキスト音声合成 (TTS) システム
- 英語版のpiperを日本人がforkしたリポジトリ
- 今回は日本語のTTSに使用
- VITS
- Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech
- piper-plusのモデルの名前
音声認識
- STT
- Speech to Text
- 音声をテキストに変換する技術
- ASR
- automatic speech recognition
- 音声認識技術
- LID
- language identification
- 言語識別
- SER
- speech emotion recognition
- 音声感情認識
- AED
- audio event detection
- 音響イベント検出
- AEC (分類)
- audio event classification
- 音響イベント分類
- Speaker identification / Speaker verification
- Speaker Identification(話者識別)
- Speaker Verification(話者照合/認証)
- 違いは、「誰であるか特定する(1対N)」か、「主張された本人か確認する(1対1)」かという点
- speech enhancement
- 「音声を綺麗にする技術」の総称
- ノイズ除去、残響除去、帯域拡張など
- タスク: 「音声 + ノイズ」→「音声」
- サブtopics:
- Speech Denoising(ノイズ除去)
- 背景ノイズの除去
- 例:エアコン、車、カフェの雑音など
- Dereverberation(残響除去)
- 残響、リバーブの除去
- 部屋の反射音を取り除く
- Bandwidth Extension(BWE/帯域拡張)
- 狭帯域音声を高音質化
- 例:電話音声(8kHz)→ 高音質音声(48kHz)
- Declipping
- クリッピング歪みの修復
- 音割れした音声の復元
- Packet Loss Concealment
- パケットロスの補完
- 通信で欠落した部分を補間
- Codec Artifact Removal
- 圧縮による劣化の修復
- 例:MP3、AACなどの圧縮ノイズ除去
- Speech Denoising(ノイズ除去)
- Source separation
- Speech Separationは音源分離の技術
- タスク: 「音声A + 音声B」→「音声A」と「音声B」
- lib:
- Audio tagging
- Audio taggingは、音声データ内の特定の音響イベントやシーン(会話、音楽、環境音など)を自動または手動で識別し、ラベル(タグ)を付ける技術
- 音声を「セリフ」「BGM」などに分類できる
- KWS
- Keyword Spotting
- 「OK Google」などのような、キーワード認識技術
- Kotoba Whisper
- 日本語に強いWhisper
- 今回は、tiny版のGGML版の量子化されたq5を使用
- 最速で動かすため、Greedy decodingとBeam Searchを調整した
- Whisper.cpp
- whisper.cppは音声データを読み込んでテキスト文章に変えてくれるソフト
- Kotoba Whisperをサーバー化するのに使用
- https://github.com/ggerganov/whisper.cpp
- sherpa
- 次世代KaldiとONNX Runtimeを活用した軽量な音声処理ツールボックス
- https://github.com/k2-fsa/sherpa-onnx
- Kaldi
- Kaldi Speech Recognition Toolkit
- 長らく音声認識のデファクトスタンダードツールとして利用されていたC++ライブラリ
- VOSK
- エッジで動く音声認識ツールキット
- 日本語モデルは、small: 48M、big: 1GBが用意されている
- SenseVoice
- ASR、LID、SER、AEC(分類)、AEDを含む音声理解能力を備えた音声基盤モデル
- https://github.com/FunAudioLLM/SenseVoice/tree/main
音認識
- VAD
- Voice Activity Detection
- 発話区間検出のための技術
- Silero VAD
- 高性能で軽量(約2MB)なオープンソースのVADモデル
- CPUで1ms以下で動作する高速性を持ち、WebRTC VADよりも高精度で、ノイズの多い環境でも音声を正確に検知 (according to the AI)
- PCM
- Pulse Code Modulation:パルス符号変調
- 非圧縮・高品質: 音波を一定周期でサンプリングし、量子化してデータ化するため、原音に忠実
- VAP
- Voice Activity Projection
- https://github.com/inokoj/VAP-Realtime
- https://github.com/maai-kyoto/maai
音の精度向上
- PipeWire
- Linuxのマルチメディアサーバー
- AEC(キャンセル)やNS、AGCの機能がある
aec_method=webrtcを今回は使用した
- AEC (キャンセル)
- acoustic echo cancellation
- スピーカーから出た周り込みを消す技術
- NS
- Noise Suppression
- 扇風機、キーボード、エアコンなどの雑音を減らす技術
- AGC
- Automatic Gain Control
- 声などの音量を自動調整する技術
音の理解向上
- Punctuation
- 意味は句読点で、句読点や記号を自動で補うこと
- Speaker Diarization
- 録音された音声データから「いつ、誰が話したか(Who spoke when?)」を特定し、発言ごとに分割・分類する技術
- いわゆる話者分離
AIモデルの処理速度向上
- LLMの量子化
- Quantization
- モデルのパラメータを高精度な数値(16/32bit浮動小数点)から低精度な数値(4/8bit整数)に変換し、モデルサイズを大幅に軽量化・高速化する技術
- 精度低下を最小限に抑えつつ、少ないVRAM(GPUメモリ)で動作させ、安価なハードウェアでの推論を可能
- ONNX
- Open Neural Network Exchangeの意味
- 異なるAIフレームワーク間でモデルを共有・実行するためのフォーマット
- OpenMP
- C/C++のマルチスレッド並列処理を簡単に書くための仕組み
- 共有メモリ環境での並列プログラミングを支援する技術
双方向会話
- Full Duplex
- Full Duplex(全二重)音声技術は、AI対話システムにおいて、ユーザーとAIが「話しながら聞く(同時双方向)」ことを可能にする技術
- 従来の「話して、待って、聞く」というターンベースの音声対話とは異なり、人間同士のような自然な相槌や発話のオーバーラップを実現する
- GPT Realtime
- リアルタイムで低遅延の会話操作を処理するように設計された音声入力、音声出力の会話システム
- Function ToolやMCPも使える
- j-moshi
- 日本語版のmoshi
- 同時双方向的な特徴をモデル化できるfull-duplex音声対話システム
- personaplex
- real-time, full-duplex speech-to-speech conversational model
- システムプロンプトを入れる事ができる
- https://github.com/NVIDIA/personaplex
処理速度向上
- 見える化
- わかりにくい状態を見て分かる形にすること
- 例えば、処理している事がわかる用にインジケータを出さないと処理速度が遅く感じた
- 非同期
- 処理の完了を待っている間に、別の処理を進める仕組み
- 応答性とスループットを最大化する手法
- マルチスレッド化
- 計算タスクを複数コアで並列処理する仕組み
- 応答性とスループットを最大化する手法
- CPU Affinity
- 処理ごとにCPUのCoreを分離する技術
- 複数の重い処理がありOSのスケジューラーに邪魔されず処理したい時に使う
- CPU clock scaling
- OSが消費電力の削減やパフォーマンスの向上のために CPU の周波数を上げ下げする技術
- Jetsonでは性能と消費電力・発熱のバランスを取るためのCPU周波数制御をしている
- 今回はこれをOffにした
- Producer-Consumerパターン
- データを生成する「プロデューサー」と処理する「コンシューマー」の間にキュー(Queue)を挟み、非同期で処理を行う設計パターン
- タスクキュー、ジョブキュー、メッセージキューなど色々な呼び方がある
- デカップリングの一種
- TinyML
- 超低消費電力・小型のデバイス上で機械学習を動かす技術
- 数KB〜数MB程度のメモリしかない小さなチップ上で、音声認識・異常検知・画像分類などを行うAI
音声分離と話者分離
- 音声分離(speech separation)
- 話者ごとに音声を分離するモデル
- 例えば、Aさんの音声、Bさんの音声のように、一つの音声を物理的に分ける
- 話者分離(diarization)
- 時間ごとに誰が喋っているか分類するモデル
- 例えば、ある音声で0
10秒はAさん、1112秒はBさんのように
有名なモデル:
- pyannote.audio
- Asteroid / ConvTasNet
- SepFormer / SpeechBrain
- MossFormer2 / ClearerVoice-Studio
音声分離の用語
bleed / leakage / crosstalk
- 本来ほしい音源に、別の音が漏れ込んでいる状態
- 音声分離では、分離しきれなかった他パートの残留音を指すことが多い
- 例:ボーカル stem にドラムや伴奏がうっすら残る
artifacts
- AI分離やノイズ除去などの処理で生じる不自然な副作用
- 例:「金属っぽい音」「水中っぽさ」「揺れ」「チリチリ音」「音の欠け」など
- bleed とは違い、元の音がそのまま漏れているというより、処理によって変質した音
doubling / ダブリング
- 同じ音や声が重なって二重に聞こえること
- 意図的な録音手法の場合もあるし、分離処理の副作用として起きる場合もある
- 例:ボーカルが一枚ではなく、薄く二枚重なって聞こえる
phasing / フェイジング
- 似た音が少しズレて重なり、位相干渉でシュワシュワ・うねうね・薄く聞こえる現象
- ダブリングに近いが、より「干渉」「位相ズレ」感が強い
ghosting / ゴースト成分
- 本来そこに残ってほしくない、薄い残像のような音
- 例:消したはずのボーカルや伴奏の輪郭が、影のように残っている
- 技術的に厳密な用語というより、聴感上の説明として使われることが多い
residual / residual component / 残留成分
- 分離・除去しきれずに残った音
- bleed や ghosting を含めて広めに表せる、やや技術寄りで無難な言い方
相槌とフィラー
- フィラー(filler / filler word / filler sound)
- フィラーは、話し手が「間を埋める」ために入れる音や言葉
- 例: um, uh, well, like, you know, I mean, sort of / kind of
- 相槌(backchannel / backchannel response)
- 相槌は、聞き手が「聞いていますよ」「理解していますよ」と示す反応、verbal nodsという事
- 例: yeah, uh-huh, right, I see, really?, sure, exactly, that makes sense
| 種類 | 主に使う人 | 役割 | 例 |
|---|---|---|---|
| フィラー | 話し手 | 間を埋める・考える時間を作る | えー、あのー、えっと |
| 相槌 | 聞き手 | 聞いていることを示す・反応する | うん、はい、なるほど |
プロソディ
プロソディ(韻律)とは、話す速度、音の強弱(ストレス)、高低(イントネーション)、ポーズなど、発話に伴う音声の音楽的・律動的な要素の総称。
プロソディは主に以下の5つの要素で構成される。
- イントネーション(抑揚): 文末のピッチの上げ下げ。疑問形や感情を表す。
- ストレス・アクセント: 単語や文の中で、どの音を強く・高く発音するか。
- リズム: 言葉の長短や強弱が織りなす拍子。
- ポーズ: 話の切れ目に入る「間」。意味のまとまりを作る。
- プロミネンス: 文中で特に強調したい部分を際立たせること。
WAVとPCM
- WAV
- 音声ファイルの形式
- 音声データを入れる「コンテナ」のようなもの
- 拡張子は
.wav
- PCM
- Pulse Code Modulation:パルス符号変調
- 音波を一定間隔でサンプリングし、音量を数値化したもの
- 非圧縮の音声データとして扱われることが多い
Mel尺度とメルスペクトログラム
- Mel尺度
- Mel尺度 は、人間の聴覚に近い周波数スケールの事
- メルスペクトログラム
- メルスペクトログラムは、音の周波数成分(音のエネルギー分布)を メル尺度で表したもの
- 普通のスペクトルは、たとえば 100Hz、200Hz、1000Hz、5000Hz……のように物理的な周波数で音を分解する
- でも人間の耳は、周波数を等間隔には感じず、低い音の違いには敏感で、高い音の細かい違いにはやや鈍い
- そこでメル尺度で、音を人間の耳に近い感覚で周波数ごとに分ける
- 深層学習・CNN/Transformer系だとlog-mel spectrogramが使われがち
STFTとMFCC
- STFT
- Short-Time Fourier Transform
- 音声を短い時間窓に区切り、それぞれの区間で周波数成分を計算する手法
- 出力は時間 × 周波数のスペクトログラム
- 実際の音声特徴量では、STFTの複素スペクトルから振幅スペクトログラムやパワースペクトログラムを使うことが多い
- MFCC
- Mel-Frequency Cepstral Coefficients(メル周波数ケプストラム係数)
- MFCCはメル特徴量を圧縮したもの
- 古典的な音声認識、特にGMM-HMM/HMM時代によく使われた特徴量
- 深層学習ASRでは、MFCCよりもlog-mel spectrogram / log-mel filterbank featuresが使われることが多い
- ただし、wav2vec 2.0やHuBERTのようにraw waveformから特徴を学習するモデルもある
MFCCまでの処理のフロー
一例として、MFCCまでは、以下のようなフローになる。
| |
サンプリング周波数・ビット深度・チャンネル
- サンプリング周波数
- 1秒間に何回、音を測るか
- 例: 16kHz、44.1kHz、48kHz
- ASRでは16kHz monoに変換して扱うことが多い
- ビット深度
- 1サンプルの音量をどれくらい細かく表すか
- 例: 16bit、24bit、32bit float
- チャンネル数
- monoは1ch、stereoは2ch
- 音声認識ではmonoに変換して扱うことが多い
- sample format
s16le、float32などs16leは signed 16bit little-endian の意味
window、hop length
- window size
- 1回の周波数分析に使う音声の長さ
- 例: 25ms
- hop length / stride
- 次の分析窓へどれくらいずらすか
- 例: 10ms
- spectrogram
- 時間ごとの周波数成分を並べたもの
- 横軸が時間、縦軸が周波数、色や値がエネルギーを表す
- log-mel spectrogram
- メルスペクトルの値に対数を取ったもの
- 音声認識や音声分類の入力特徴量としてよく使われる
VADとEndpointing
- VAD
- Voice Activity Detection
- 今この瞬間に音声があるかを判定する技術
- 「声か、無音か」を見る
- Endpointing
- 発話が終わったかを判定する技術
- ASRやLLMにいつ入力を渡すかを決める
音声AIの評価指標
- RTF
- Real Time Factor
- 音声の長さに対して、処理に何倍の時間がかかったか
- RTF < 1 ならリアルタイム処理可能
- 例: 10秒の音声を2秒で処理できるならRTF=0.2
- WER
- Word Error Rate
- 単語単位の音声認識エラー率
- 英語など単語区切りが明確な言語でよく使われる
- CER
- Character Error Rate
- 文字単位の音声認識エラー率
- 日本語ASRではWERよりCERの方が扱いやすい場合がある
- MOS
- Mean Opinion Score
- TTSなどの音質を人間が主観評価する指標
Gain・dBFS・Clipping
- Gain
- 音量を増幅・減衰させる量
- マイク入力が小さすぎるとASR精度が落ち、大きすぎると音割れする
- dBFS
- デジタル音声における音量の単位
- 0 dBFS が最大値で、それを超えるとクリッピングする
- Clipping
- 音量が大きすぎて波形の上下が潰れる現象
- 音割れの原因になる
- 一度クリッピングした音声は完全には元に戻せない
- Normalization
- 音声全体の音量を一定基準に揃える処理
Ring buffer / Chunking
- Ring buffer
- 固定長のバッファを循環させながら使うデータ構造
- マイクから連続的に入ってくる音声をリアルタイム処理する時に便利
- Chunking
- 音声を一定長の塊に分けて処理すること
- 例: 10ms、20ms、30ms、1秒など
注意点:
- チャンクが短いほど低遅延だが、認識や判定が不安定になりやすい
- チャンクが長いほど安定するが、遅延が増える
- VAD、ASR、TTSで最適なチャンク長は異なる
CMVN
画像の前処理でやるものと同じように、分布の中心を平均にして、スケールをSDにする処理の事。
- CMVN
- CMVN(Cepstral Mean and Variance Normalization)とは、音声特徴量を「平均0・分散1」にそろえる前処理
- CMVN = CMN + CVNで、画像の前処理と同じようなZ値化のための統計処理
- CMN:平均を引く
- 特徴量の中心を0にする
- CVN:標準偏差で割る
- ばらつきを1にする
bank、fbank
- filter bank
- filter bank は、複数の周波数フィルタを並べたもの
- イメージとしては、音声に対するザルのようなもの
1 2 3 4 5 6 7音声信号 ↓ [低音フィルタ] → エネルギー1 [中低音フィルタ] → エネルギー2 [中音フィルタ] → エネルギー3 [高音フィルタ] → エネルギー4 ... - fbank
- 各時間フレームごとに、メル周波数帯域ごとのログエネルギーを並べたもの
- 例えば、80次元 fbank なら、1フレームごとにこういうベクトルになる
1 2 3 4frame 1: [band1, band2, band3, ..., band80] frame 2: [band1, band2, band3, ..., band80] frame 3: [band1, band2, band3, ..., band80] ... - これが時間方向に並ぶので、画像っぽく見ると スペクトログラムみたいになる
CTCとアライメント不明問題
- アライメント不明問題
- 音声の波形データ(いつ、どんな音が鳴ったか)と、テキスト(文字データ)の対応関係が不明・不正確になってしまう問題のこと
- 例:
1 2- 入力: 音声フレーム 100個 - 出力: 文字列 "hello" 5文字 - 上記のような、入力は長い時系列データだけど、出力は短いラベル列になる
- しかも、「どの音声フレームが h に対応するか」「どこから e か」みたいな対応関係は普通はわからなくなる
- CTC
- Connectionist Temporal Classification
- 日本語だと 「結合主義的時系列分類」
- 入力と出力の対応位置がわからない時系列タスク(アライメント不明問題)で使う損失関数
- CTC では、通常の文字ラベルに加えてblank(
-)という特殊ラベルを使う
1h - - e l - l o- そして、最後にblank を消して、連続重複をまとめることで
helloにする - つまり、CTCは、ある正解ラベル列に対応しうる多数のアライメント候補を全部考慮して、その合計確率を最大化するように学習する
CTCとRNN-T
- CTC
- 学習が速い
- encoder-onlyで構造がシンプル
- 出力形状は主に 時間T × 語彙V
- ベースラインや高速学習に向いている
- RNN-T
- CTCより学習は重い
- encoder + prediction network + joint network を使う
- 時間T × 出力長U の格子上で計算するため、CTCよりメモリ・計算量が大きい
- ただし、出力履歴を使えるため精度やストリーミングASRでは有利になりやすい
- pruned RNN-Tなどの最適化で学習速度はかなり改善できる
BPTTとTBPTT
RNN 系モデルで長い系列を学習するときに使う誤差伝搬の仕組み。
- BPTT
- BPTT / Backpropagation Through Time の略
- シリーズ全体に対して過去方向へずっと誤差を逆伝播する
- たとえば文章が 1,000 トークンあるなら、理屈上は 1,000 ステップぶん遡って勾配を計算する仕組み
- TBPTT
- Truncated Backpropagation Through Time の略で、日本語だと 「切り詰めた時間方向の誤差逆伝播」
- シリーズを短い区間に分割して、たとえば 20 ステップごと や 100 ステップごとに区切って学習する仕組み
Conformer、Emformer、Zipformer
音響特徴量を高レベル表現に変換する acoustic encoder。
- Conformer
- Transformer + CNN の王道ASR encoder
- 通常はchunk attention / causal convなどでストリーミング化
- 精度が高く、実装・知見が多い
- Emformer
- Streaming前提のmemory-efficient Transformer
- 入力をsegmentに分け、left/right contextとmemory bankを使う
- 低遅延streamingに素直。Torchaudioにも実装あり
- Zipformer
- Conformerを高速・省メモリ・高精度に再設計した新しめのencoder
- chunk/cached attentionなどでstreaming対応
- icefall系でよく使われる
- 速い・省メモリ・精度が良い傾向だが、構造が複雑。実装依存が強め
結論
- 音の中でも会話についての技術をまとめた
- 会話とはダンシングであり、交通整理が大事
- そこをリアルタイムでやるのがミソ
参考文献
- [1分でわかる]Speech Enhancementってなんだ?音源分離との違いと、その概念編 #音声AI - Qiita
- Energy-Efficient Hardware Acceleration of Whisper ASR on a CGLA
- Azure OpenAI で音声とオーディオに GPT Realtime API を使用する - Microsoft Foundry | Microsoft Learn
- 音声認識AIモデル ZipFormer - Convergence Lab.
- 音響特徴量「メルスペクトル」と「MFCC(メル周波数ケプストラム係数)」の解説と実例紹介|お知らせ/ブログ|「FAST-D」AI異音検知ソリューション | Hmcomm株式会社
