発話検知

ビデオ通話アプリに、声量を可視化する UI(ボイスインジケーター)を追加したい場合があります。
このニーズは、SkyWay Android SDK が提供する getAudioLevel() API を利用することで実装できます。
本ページでは、getAudioLevel() API の利用方法について解説します。

ストリームの音量レベルを取得する

SkyWay Android SDK では、音声ストリームの音量レベルを取得する API を提供しています。

  • fun getAudioLevel(): Double
    • 直近100ミリ秒間における音声ストリームの最大音量を返します。
    • 戻り値:
      • Double: 音量レベルの値を 0.0(無音)から 1.0(最大音量)までの範囲で返します。
      • 相手に Subscribe される前の LocalAudioStream や、音声データが流れていない場合は 0.0 を返します。
    • API Reference Link:

getAudioLevel() は呼び出される時点の値しか返さないため、ボイスインジケーターのように継続的に音量レベルを監視したい場合は、コルーチンなどを使って定期的にメソッドを呼び出します。 以下のサンプルコードは、100ミリ秒ごとに LocalAudioStream の音量レベルを取得してログに出力します。音量レベルの値は0.3以上であればログに出力されます。

RemoteAudioStream でも全く同じように使用できますのでコード例は略します。

class VoiceIndicatorActivity : AppCompatActivity() { private var localAudioStream: LocalAudioStream? = null private var levelMonitoringJob: Job? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 1. LocalAudioStreamのインスタンスを作成 localAudioStream = AudioSource.createStream() // ... Publicationの処理など ... // 2. 音量レベルの監視を開始 startMonitoringAudioLevel() } private fun startMonitoringAudioLevel() { // 既存の監視ジョブがあればキャンセル levelMonitoringJob?.cancel() // ライフサイクルスコープでコルーチンを開始 levelMonitoringJob = lifecycleScope.launch { while (isActive) { // 3. getAudioLevel()を呼び出して音量を取得 val audioLevel = localAudioStream?.getAudioLevel() ?: 0.0 // 4. 取得した値は0.1より大きい場合をUIの更新やログ出力などに利用 if (audioLevel != null && audioLevel > 0.1) { Log.d("VoiceDetection", "Local Audio Level: %.3f".format(audioLevel)) } // 100ミリ秒待機 delay(100) } } } override fun onDestroy() { super.onDestroy() // Activityが破棄される際に、安全のためジョブをキャンセル levelMonitoringJob?.cancel() localAudioStream?.dispose() } }

注意点

  • UI の更新は必ずメインスレッドで行ってください。上記の例では lifecycleScope を使用しているため、withContext(Dispatchers.Main) などを使って UI 更新処理をメインスレッドに切り替えることを推奨します。