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

オーディオフック

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

対応する通話タイプSDKの最低バージョン
1対1通話5.5

概要

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

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

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

オーディオフックが有効になると、OnHookedイベントを通じてHookedAudioオブジェクトを受け取ることができます。

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

オーディオデータを修正するには、次の手順に従ってください。

  1. HookedAudio::GetAudioData()を呼び出してオーディオデータを取得してください。
  2. 取得したオーディオデータを必要に応じて修正してください。
  3. HookedAudio::SetAudioData()を呼び出して修正されたオーディオデータを設定してください。
Note

HookedAudioクラスでは、未加工(raw)オーディオデータのみ修正できます。チャンネル、サンプル数、サンプルレート、サンプルタイプ、シーケンス番号のようなメタデータは変更できません。未加工オーディオデータを修正するには、必ずメタデータが示す形式を維持する必要があります。

オーディオデータの復元

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

Warning

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

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

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

サンプルコード

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

// Implement audio modifier with IAudioHook
class MyAudioHook : public PlanetKit::IAudioHook {
public:
void OnHooked(PlanetKit::HookedAudioPtr pHookedAudio) {
const AudioData audioData = pHookedAudio->GetAudioData();

if(m_pAudioBuffer == nullptr) {
m_pAudioBuffer = new unsigned char[audioData.unBufferSize];
}

// Dump audio data
memcpy(m_pAudioBuffer, audioData.pBuffer, audioData.unBufferSize);

// Process `m_pAudioBuffer` as necessary
...

// Set modified data to pHookedAudio
pHookedAudio->SetAudioData(m_pAudioBuffer, audioData.unBufferSize);

// Put audio data back to PlanetKit
m_pCall->PutHookedMyAudioBack(pHookedAudio);
}

private:
unsigned char* m_pAudioBuffer = nullptr;
unsigned int m_unBufferSize = 0;

// Prepare instance of `PlanetKitCall`
PlanetKit::PlanetKitCallPtr m_pCall;
}

class MyApplication {
public :
// Method to enable audio hook
void EnableAudioHook() {
m_pCall->EnableHookMyAudio(m_audioHook, this, [](void* pUserData, bool bSuccess){
if(bSuccess == true) {
OutputDebugStringW(L"Audio hook enabled successfully\n");
}
else {
OutputDebugStringW(L"Failed to enable audio hook\n");
}
});
}

// Method to disable the audio hook
void DisableAudioHook() {
m_pCall->DisableHookMyAudio(this, [](void* pUserData, bool bSuccess) {
if(bSuccess == true) {
// Successfully disabled audio hooking
OutputDebugStringW(L"Audio hook disabled successfully\n");
}
else {
OutputDebugStringW(L"Failed to disable audio hook\n");
}
});
}

private :
// Prepare instance of PlanetKitCall
PlanetKit::PlanetKitCallPtr m_pCall;

// Prepare instance of MyAudioHook
PlanetKit::SharedPtr<MyAudioHook> m_audioHook = PlanetKit::MakeAutoPtr<MyAudioHook>();
};

関連API

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

クラス/インターフェース

メソッド

イベント