発話検知
SkyWay Android SDK が提供する getAudioLevel() API を用いることで、音量を可視化する UI(ボイスインジケーター)などの実装が可能です。
本ページでは、getAudioLevel() API の利用方法について解説します。
人の声量に絞って取得したい場合は、AI Noise Canceller と併用することで実現可能です。
このライブラリを用いることで、人の声以外の雑音を抑制することができます。
AI Noise Canceller については、こちらの資料をご確認ください。
ストリームの音量レベルを取得する
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 更新処理をメインスレッドに切り替えることを推奨します。