🤖

DroidKaigi 2022 セッションレポート #3

2022/11/02に公開

株式会社TOKIUMでAndroidエンジニアをしている仙北谷(@tsemb012)です! このシリーズでは、10月5日(水)-7日(金)の3日間に渡り開催されたDroidKaigi 2022にて、聴講したセッションの中でも印象に残ったモノをいくつか紹介しています。この記事では、印象に残った「人の声を可視化する」セッションをシェアします! エンジニア歴1年で理解できない部分もありましたが、学習もかねて不明な用語を補足しました。

人の声を可視化する

Voicy社のAndroidリードエンジニアをされている大沼美幸さんの発表です。
メインテーマは「人の声を可視化」ですが、応用的な実装のみならず、音声処理の基礎的な知識も学べるセッションでした。

解説1# 音声処理の手順と使用ライブラリ

音声処理は「録音」と「再生」に分けられ、 いずれも「設定」→「読み込み・変換」→「ライブラリへの書き込み」の順で処理が行われるとのことでした。 それぞれの具体的な処理は以下の通りです。

録音

  1. メディア情報と最小バッファサイズの設定
  2. 音声データを読み込んでエンコード
  3. エンコードした音声データのファイルへの書き込み

再生

  1. メディア情報オーディオ属性の設定
  2. 取得したデータをバイトデータにデコード
  3. 再生プレイヤーへ書き込み

そして、実際にAndroid上での音声処理を実現するために「録音」・「再生」それぞれの2つのライブラリが紹介されました。MediaRecorder / MediaPlayer は簡単に実装ができますが柔軟性にかけ、AudioRecord / AudioTrackは柔軟性が高いものの実装が複雑になってしまうという特徴があります。 本セッションのテーマである「人の声を可視化する」実装においては、「細やかな設定が可能」かつ「バイナリデータを扱える」AudioRecord / AudioTrackを使用することが適切であるとのことでした。

録音/レコーダーライブラリ

  • MediaRecorder
    • 機能
      • 録画・録音
    • 特徴
      • 自動的にファイルに書き込みが可能
      • シンプルなステートマシンで制御が可能
  • AudioRecord
    • 機能
      • 録音のみ
    • 特徴
      • 自前でファイルのフォーマットに合わせた書き込みが必要
      • 細やかなメディア設定が必要
      • リアルタイムな音声情報の操作が可能(録音しながら音声の入力情報を取得が可能)

再生/プレイヤーライブラリ

  • MediaPlayer
    • 機能
      • 動画・音声の再生
    • 特徴
      • ファイルを指定するだけで簡単に再生が可能
      • シンプルなステートマシンで制御することが可能
      • CPUやリソースを多く消費
  • AudioTrack
    • 機能
      • 音声の再生のみ
    • 特徴
      • ストリーミングでの再生が可能
      • 低レイヤーAPIなのでバイナリーを扱うことが可能

#解説2 バイトデータをAudioTrackから再生する。

低レイヤーAPIであるAudioTrackを使用する場合、録音した音声ファイルをバイトコードに変換し、再生する必要があります。 具体的な処理としては、

  1. MediaExtractorで音声ファイルデータを読み込み・解析
  2. 読み込んだデータをMediaCodecでバイナリデータにデコード
  3. デコードしたデータをAudioTrackに書き込んで再生

という流れでした。また、実装に際して注意することとして下記3点が挙げられていました。

  • DACの取り扱い
    • デジタル音声を再生する端末には全てデジタル音源をアナログ信号に変換するDACが搭載されている。
    • ここにバイトデータを一気に流し込んでしまうと消化不良を起こし、音声再生に失敗してしまうので、小さなチャンクに区切って書き込まなければいけない。
  • メモリー不足
    • 大容量ファイルを再生する場合、メモリを使い切ってしまうので、音声データの一部を順次切り出して再生する必要がある。
  • メインスレッドの占有
    • UIスレッドが長時間ブロックされてしまうので、別スレッドで再生・録音処理を行う必要がある。

解説#3 音声を可視化

Voicy社では、録音中の声をRecyclerViewでつくった波形で表現しています。これにより、発声箇所を確認し、 詰まった部分や発音してない部分をカットするというユースケースを実現しているそうです。 「RecyclerView」 x 「AudioRecord」 x 「LinearSmoothScroller」のクラスを組み合わせて実装されており、 それぞれの役割については下記の通りです。

  • RecyclerView
    • リストを横置きにし、1秒間に読み込むバッファサイズに応じて振幅を動的に変更し、波形を表現する
  • LinearSmoothScroller
    • 波形をスームズにスクロールするのを助ける
  • AudioRecord
    • 録音中の音声情報を取得し、リアルタイムにRecyclerViewに情報を渡す

また、RecyclerViewの他にもVisualizerクラスにて可視化が可能であることをご紹介いただきました。 こちらは低レイヤーAPIである AudioRecord / AudioTrack のみならず、音声処理を簡単に実装できるMediaPlayerにも対応しているようです。

感想

MediaPlayer/MediaRecorderで音声処理の実装をした経験は私にもありましたが、簡便に実装できるライブラリであるが故に、音声処理に対する深い理解はできていませんでした。
今回のセッションでは、音声処理の仕組みや、低レイヤーライブラリを用いた実装を紹介いただき、音声処理の理解が深まりました。 個人で開発中のアプリに、リアルタイムの音声通話および波形での音声表現を実装する予定ですので、AudioTrack x RecyclerViewを用いた実装に挑戦してみようと思います。 実装完了した暁には、あらためて記事にしますのでご期待ください。

【用語解説】

メディア情報とは?

  • 音声データの性質を変化させる要素のこと。
    • 入力ソース:どの音源を使用するかを選択
    • サンプリングレート:どれくらいの間隔で何分割して音を採取するかを選択
    • 音声チャネル:モノラルかステレオかを選択
    • エンコーディング形式:音声データをどのように符号化するかを指定

オーディオ属性とは?

ステートマシンとは?

  • 状態のセット、遷移のセットおよび現在の状態をひとまとめにして ステートマシンと呼ぶ。
  • 例えば、録音処理を行う際に、以下のようなステートマシンを想定することができる。
    1. 録音開始
    2. 録音中
    3. 録音停止
    4. 録音終了

低レイヤーとは?

DACとは?

株式会社TOKIUM テックブログ

Discussion