本文にスキップする
Version: 1.0

オーディオフック

PlanetKitは、オーディオフック(audio hooking)という機能を提供します。これは、Planet Cloudが相手にオーディオを転送する前にオーディオデータを取得(フック)する機能です。ローカルユーザーの音声を変えたり、オーディオデータを音声認識に活用したりする用途で使用できます。

概要

オーディオフック機能を使用するためのメソッドは、HookAudioExtensionで提供しています。

オーディオフックの有効化

オーディオフックを有効にするには、PlanetKitCallHookedAudioHandlerの実装を引数としてenableHookMyAudio()を呼び出します。

オーディオデータの修正(オプション)

フックしたオーディオデータを修正するには、PlanetKitHookedAudiosetData()を使用します。

Note

setData()メソッドは、rawオーディオデータ(data)のみ修正できます。channelsampleCountsampleRatesampleTypeseqのようなメタデータは修正できません。

オーディオデータの復元

フックしたオーディオデータを元に戻すには、PlanetKitHookedAudioオブジェクトを引数としてputHookedMyAudioBack()を呼び出します。

Warning

オーディオフックを有効にした後は、オーディオデータの修正有無にかかわらず、フックしたオーディオデータを必ず元に戻す必要があります。そうしないと、相手にオーディオが転送されません。

オーディオフックの無効化

オーディオフックを無効にするには、disableHookMyAudio()を呼び出します。

サンプルコード

以下のサンプルコードは、音声を変えるためにオーディオフック機能を使用する方法を示しています。

func modifyVoice(PlanetKitCall call) async {
final audioClipper = PlanetKitCallHookedAudioHandler(
onHook: (call, audio) async {
if(await audio.setData(clipAudioData(audio.data, 0.01)) {
await call.putHookedMyAudioBack(audio);
}
},
);
final result = await call.enableHookMyAudio(audioClipper);
print("enableHookMyAudio result: $result")
}

Uint8List clipAudioData(Uint8List audioData, double threshold) {
var floatData = audioData.buffer.asFloat32List();
for (int i = 0; i < floatData.length; i++) {
double value = floatData[i];
if (value > threshold) {
floatData[i] = threshold;
} else if (value < -threshold) {
floatData[i] = -threshold;
}
}
return Float32List.fromList(floatData).buffer.asUint8List();
}

関連API

オーディオフック機能に関連するAPIは、以下のとおりです。