オーディオフック
PlanetKitは、オーディオフック(audio hooking)という機能を提供します。これは、Planet Cloudが相手にオーディオを転送する前にオーディオデータを取得(フック)する機能です。ローカルユーザーの音声を変えたり、オーディオデータを音声認識に活用したりする用途で使用できます。
概要
オーディオフック機能を使用するためのメソッドは、HookAudioExtension
で提供しています。
オーディオフックの有効化
オーディオフックを有効にするには、PlanetKitCallHookedAudioHandler
の実装を引数としてenableHookMyAudio()
を呼び出します。
オーディオデータの修正(オプション)
フックしたオーディオデータを修正するには、PlanetKitHookedAudio
のsetData()
を使用します。
Note
setData()
メソッドは、rawオーディオデータ(data
)のみ修正できます。channel
、sampleCount
、sampleRate
、sampleType
、seq
のようなメタデータは修正できません。
オーディオデータの復元
フックしたオーディオデータを元に戻すには、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は、以下のとおりです。