DCON2023の各校の成果からE資格合格につながる技術を学んでいくシリーズ、パート3です。今回のテーマは「音声認識」と「異音検知」です。

■ 今日のおしながき

音声認識とは
異音検知とは
各校のソリューション
    音声認識:沼津高専
    異音検知:長岡高専
E資格の観点で復習
    E資格シラバスの「音声処理」3アイテム
    WaveNet
    周波数 (E資格シラバス範囲外)
    フーリエ変換 (E資格シラバス範囲外)
    スペクトログラム (E資格シラバス範囲外)
    短時間フーリエ変換
    メル尺度 (メルスペクトログラムを例として)
    CTC
    Whisperのモデル・学習と試し方 (今のところ恐らくE資格範囲外)

■ 音声認識とは

音声とは人の声を示します。これは「声」という字が含まれていることからも想像されることでしょう。したがって、音声認識(speech recognition)とは、人の声を認識する行為ということになります。多くの場合、人の発話をテキストに変換する処理(*)を指します。
(*) 「文字起こし(speech-to-text)」と呼ぶこともあります。

(参考) 音声認識は、音声処理の一種として位置づけられます。
・音声処理 (speech processing)
    - 音声合成 (text-to-speech)
    - 音声認識 (speech recognition)

■ 異音検知とは

異音(もしくは異常音)とは、機器や生物などのシステムが正常でない場合に発する音のことです。異音を検知する行為を異音検知と呼びます。人の声以外も対象としますので、「音響処理 (acoustic signal processing」の一種と捉えるのが適切です。

異音検知の目的を以下に例示しておきます。
・機器の異常音を検知して、該当機器の製品検査にて不良品を選別する
・機器の異常音を検知して、該当機器による設備の故障もしくはその予兆を検知する
・銃声や悲鳴、爆発音やガラス破壊音を検知して、事件・事故の発生や状況を検知する
・肺音や心音から、身体の異常を検知する

他にも極めて幅広い用途が考えられます。異音検知はE資格シラバスでは範囲外となっているものの、応用範囲の広い重要な技術です。

■ 各校のソリューション

DCON2023の参加校の中では、沼津高専が音声認識を用いたソリューションを、長岡高専が異音検知を用いたソリューションを、それぞれ開発していました。中身を見ていきましょう。

7 沼津工業高等専門学校 D4AI

・テーマ名・概要    (当日のプレゼンへのリンクはこちら
ルックンちび
保育士の書類作成作業と午睡チェックを支援する総合保育システム
保育士の仕事は、手がふさがっていることが多いので、例えばタブレットを触って書類を作成している暇はないそうです。そんな多忙な保育士の皆様のために、書類作成システムを音声認識で実現したとのことでした。
image.png 59.39 KB(ちなみに、子供が寝ている様子をチェックする「午睡チェック機能」は画像認識で実現されています。こちらはパート2をご参照ください。)

・松尾先生からの技術コメント(こちらのリンクで視聴できます)

- お昼寝の姿勢は、YOLOでキーポイントを認識して、右肩・左肩がどの位置にあるかでうつ伏せなのか仰向けなのかを判定している
- 書類の作成は音声認識を使用してテキスト化し、ChatGPTを用いて規定のフォーマットに直している

・もりさん補足
プレゼンの中で、文字起こしにはOpenAIWhisperを使用したとの説明がありました。
image.png 56.16 KB
システム構成はこちらから視聴することができます。
https://www.youtube.com/watch?v=xc_mTBptzNo&t=10382simage.png 68.13 KB
この図によれば、マイク入力をRasberry Pi Zeroにてデジタル化してJetson Orinに渡し、Jetson Orinの中で音声認識を実施している模様です。WhisperはJetson Orin内で、ChatGPTはJetson OrinからAPIを呼び出すことで、それぞれ動作しているのではないかと思われます。

5 長岡工業高等専門学校 長岡高専プレラボ

・テーマ名・概要  (当日のプレゼンへのリンクはこちら
その音どーいが?音による異常検知で工場の人手不足を解決
長岡市にある印刷工場では、シールの箔押しで糊の染み出しによる異常が発生し、以降の印刷物が全て不良品となってしまうという問題があるそうです。しかし、その工場では、その異常を、ベテラン社員が音を聞いて判断しなければならない状況にあったそうです。
https://www.youtube.com/watch?v=xc_mTBptzNo&t=6855s
image.png 137.67 KBなぜ音を聞いて判断しなければならないかというと、糊の染み出しは見た目では判断できないからなんだそうです。難しいですね。
image.png 75.33 KB
そこで、この糊の染み出しによるローラーが異常音を出していないかをAIで分析し、異常を検知した場合は作業員に警告を出すシステムを開発しました。

システム構成の紹介がありましたので掲載しておきます。Outputの先は警告灯です。
https://www.youtube.com/watch?v=xc_mTBptzNo&t=6926s
image.png 162.21 KB
・松尾先生からの技術コメント(こちらのリンクで視聴できます)

- 異音検知はこれまでも取り組まれているテーマで、フーリエ変換で周波数の画像を見て異常を検知するという技術はあった。
- ただ、今回は工夫がしてあって、特徴量を取り出して、それを辞書的に登録し、
それとのパターンマッチングをやっている
ので、データ数が非常に少なくて済む。
- 周期性がなくても対応できる。周期が変わっても異常を検知できる


・もりさん補足
システム構成の中で「音声処理/スペクトログラム変換」が出てきます。スペクトログラムのイメージを持ちながら、E資格の新シラバスで追加されたサンプリング、短時間フーリエ変換、メル尺度を学ぶとわかりやすいと思いますので、後述します。

■ E資格の観点で復習

E資格シラバスの「音声処理」3アイテム
E資格シラバスには、音声処理として図のように3アイテムが挙げられています。
image.png 7.9 KB(E資格シラバス2022より抜粋、筆者が加筆修正)

このうち、サンプリング、短時間フーリエ変換、メル尺度は、音声(人の声)専用ではなく、自然の音や機械の音などを含む「音響」全般に用いることのできる要素技術です。基礎的な要素技術ですので詳細は割愛し、以下、WaveNet、CTCの概要紹介と、Whisperについて解説しておきます。

WaveNet
WaveNetは、2016年9月に提出された論文「WaveNet: A Generative Model for Raw Audio」で公開されました。WaveNetは音声処理のための機構で、代表的な用途は音声合成(*)です。
(*) 実はWaveNetは音声認識に適用することも可能であると論文「WaveNet: A Generative Model for Raw Audio」に記載されています。念のため。

以下は、WaveNetが入力音声を元に学習していく様子を示しています。
image.png 51.09 KB(論文「WaveNet: A Generative Model for Raw Audio」 Figure 3: Visualization of a stack of dilated causal convolutional layers より抜粋)

ちなみに学習動作のアニメーションを、WaveNetの開発元であるDeepMind社のサイト「WaveNet: A generative model for raw audio」にて閲覧することができます。このアニメを見ていると、音声を入力してそれをWaveNetが学習していく様子がわかる、気になってきます!ぜひご参照ください。

周波数 (E資格シラバス範囲外)
周波数は「波動や振動が単位時間当たりに繰り返される回数」だと定義されます。音の場合には空気の1秒間の振動数をHzという単位で数値化します。

周波数が高い音は高く聞こえ、低い音は低く聞こえます。ちなみに小学校の音楽で用いるドレミのド(C1)は32.703Hz、一階上のC2が65.406Hz、C3が130.813と、一オクターブ上がる毎に周波数がおおむね倍になります。ちなみに鬼滅の刃の主題歌一曲目「紅蓮華」の最高音がC5の523.251Hzです。

フーリエ変換 (E資格シラバス範囲外)
フーリエ変換とは、ある音が、どのような周波数の音の合成でできているかを明らかにする変換です。

例えば小学校の音楽で出てくる代表的な和音である「ドミソ」の和音をフーリエ変換すると、ドの周波数32.703Hz、ミの周波数41.203Hz、ソの周波数48.999Hzの3箇所が高くなるグラフができます。

スペクトログラム (E資格シラバス範囲外)
スペクトログラムとは、時間経過に伴う音の周波数の変化の分析結果です。視覚化する場合、横軸に時間、縦軸に周波数、そして色で各周波数成分の強弱を表現することが多いようです。

これは例があるとわかりやすいので見て行きましょう。以下に、Pytorchを用いて、Audio Feature Extractions — Torchaudio 2.0.1 documentationに記載されている方法で、C1のド(32.703Hz)を皮切りに、ドレミファソラシドをC2のド(65.406Hz)まで演奏したファイルのスペクトログラムを作成してみましたので展示しておきます。これを見ると、横軸で時間が経過するごとに、32.703Hzから始まって65.406Hzまで、少しずつ強めに出る周波数が高くなっているのが読み取れると思います。
image.png 141.5 KBちなみにこれはオルガンの音。主な周波数成分以外の成分が強く出ている点はご容赦を。

今回はドレミファソラシドですが、楽曲であればスペクトログラムにより旋律が見えてくるはずです。

短時間フーリエ変換
ようやく、E資格シラバスの内容に到達しました。

前章でスペクトログラムを紹介しましたが、この分析のためには、音を時間で区切り、各区間ごとの周波数を明らかにする必要があります。したがって、区切った時間の音の波形ごとにフーリエ変換を行うことになります。これを、短時間フーリエ変換と呼びます。

メル尺度
メル尺度は、音の高さの数値が知覚と合うように作られた尺度です。

これも例があるとわかりやすいかな、と思いましたので、Audio Feature Extractions — Torchaudio 2.0.1 documentationのやり方で、C1(32.703Hz)、C2(65.406Hz)、C3(130.813Hz)、C4(261.626Hz)、C5(523.251Hz)のように1オクターブずつ音を上げて行った場合のスペクトログラムとメルスペクトログラムを作成してみました。音が悪くてあんまりわかりやすくならなかったですが・・・

こちらが通常のスペクトログラム。
image.png 133.48 KB
こちらがメルスペクトログラム。1オクターブ一尾ずつ高くしていくと、周波数は倍々の指数関数的な増加をしますが、メルに直すとなんとなく一次関数的になった?ように感じられるでしょうか?感じられんな。データ取りからやり直さないと・・・残念。
image.png 148.46 KB
CTC
CTCは、2006年の国際学会で発表された論文「Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks」にて説明されています。

論文名に出てくるunsegmented sequence dataは「区分けがされていない時系列データ」音声(人の発話)データや筆記体で書かれた手書き文字列はその典型例です。この両者は、もともと「区分け済」である文字列データとは異なり、切れ目が曖昧(ambiguous boundaries)ですので区分け済とは言えません。

これを、時系列データを扱うのに適したニューラルネットワークであるRecurrent Neural Networks(RNN)で扱うための技術が、Connectionist Temporal Classification(CTC)です。

この枠組みを大雑把に表す図がないかなと探してみたところ、以下が見つかりましたので紹介しておきます。
image.png 29.53 KB論文「音声認識における深層学習に基づく音響モデル 」の図-1より抜粋。CTCは下の「End-to-Endモデル」側
image.png 29.52 KB同じく論文「音声認識における深層学習に基づく音響モデル」の図-4より抜粋。

個人的には、CTCの学習過程もアニメを見るのがわかりやすいと思います。サイト「Sequence Modeling With CTC」がわかりやすかったので紹介しておきます。

Whisperのモデル・学習と試し方
Whisperは、今のところ資格範囲外ですが、沼津高専でも使われていたので紹介しておきたいと思います。

Whisperは、2022年12月に提出された論文「Robust Speech Recognition via Large-Scale Weak Supervision」で紹介されています。詳しい方は既にご存じと思いますが、Whisperは
sequence-to-sequence Transformer model
でできていて、以下をトレーニングしてある基盤モデルとなります。
    ・英語を含む複数の言語のスピーチ → テキスト変換(multilingual speech recognition)
    ・何語で話しているかの特定(spoken language identification)
    ・各言語から英語への翻訳(speech translation)
image.png 121.37 KB
また、Whisperは非常に簡単に試すことができます。これについては@Yoshitada Kurozumi さんのブログ「AIモデルの活用(2022秋CDLE DAY)」を参考にしてみて下さい。

最低限これだけですので。筆者もKurozumiさんに教えてもらってすぐに遊びましたw

import whisper

model = whisper.load_model("medium")
result = model.transcribe("movie.mp4")
print(result["test"])