as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

@amazon-devices/keplerscript-audio-lib

@amazon-devices/keplerscript-audio-lib

KeplerオーディオインターフェイスAPIは、アプリでオーディオを管理するための機能を提供します。これは、いくつかの主要コンポーネントで構成されています。

  • オーディオマネージャー: 音量、ミュート、デバイス管理など、システムレベルのオーディオコントロールを処理します。
  • オーディオ再生: オーディオストリームを再生できるようにします。カスタマイズ可能な属性を備えています。
  • オーディオフォーカス管理: さまざまなオーディオストリームのオーディオフォーカスを管理します。

このAPIは、Kepler向けReact Nativeアプリと連携するように設計されており、次のような機能を持つオーディオ対応アプリを構築するための基盤を提供します。

  • さまざまなオーディオタイプの音量制御とミュート制御
  • オーディオデバイスの管理
  • システムサウンドの管理
  • オーディオフォーカスの処理
  • オーディオストリームの構成と管理

開始の手順

セットアップ

  1. package.jsonファイルのdependenciesセクションに、以下のライブラリ依存関係を追加します。

    クリップボードにコピーしました。

     "@amazon-devices/keplerscript-audio-lib": "~2.0.0"
    
  2. manifest.tomlに、以下の権限リクエストとサービスリクエストを追加します。

    クリップボードにコピーしました。

    [[needs.privilege]]
    id = "com.amazon.audio.privilege.microphone.access" 
    
    [wants]
    
    // 必要なサービスのみを追加します 
    [[wants.service]]
    id = "com.amazon.audio.stream" // AudioStream APIを使用してオーディオ再生を実行する場合。
    [[wants.service]]
    id = "com.amazon.audio.control" // AudioManagerの場合、AudioFocus APIを使用します。
    [[wants.service]]
    id = "com.amazon.audio.system" // SoundPlayerまたはSystemSound APIを使用して低レイテンシで短いサウンドを再生する場合。
    

マニフェストファイルのneedsセクションの詳細については、マニフェストの [needs] セクションを参照してください。

使用方法

プロジェクトにKeplerAudioInterfaceターボモジュールをインポートします。

クリップボードにコピーしました。

import { 
    AudioManager,
    AudioPlaybackStream,
    AudioPlaybackStreamBuilder,
    AudioFocusManager,
    AudioFocusSession
} from '@amazon-devices/keplerscript-audio-lib';

オーディオ

オーディオ音量の管理

クリップボードにコピーしました。

// メディアの音量を設定します。
await AudioManager.setVolumeAsync(AudioVolumeType.VOLUME_TYPE_MEDIA, 75, AudioVolumeFlags.VOLUME_FLAG_SHOW_UI);

// 現在の音量を取得します。
const volume = await AudioManager.getVolumeAsync(AudioVolumeType.VOLUME_TYPE_MEDIA);

オーディオ再生の作成と管理

クリップボードにコピーしました。

// 再生ストリームを作成します。
const builder = new AudioPlaybackStreamBuilder();
builder.setAudioConfig({
    sampleRate: AudioSampleRate.SAMPLE_RATE_44_1_KHZ,
    channelMask: AudioChannelMask.CHANNEL_STEREO,
    format: AudioSampleFormat.FORMAT_PCM_16_BIT
});
builder.setAudioAttributes({
    contentType: AudioContentType.CONTENT_TYPE_MUSIC,
    usage: AudioUsageType.USAGE_MEDIA,
    flags: AudioFlags.FLAG_NONE
});

const playbackStream = await builder.buildAsync();
await playbackStream.startAsync();

Managing audio focus

クリップボードにコピーしました。

// オーディオフォーカスを作成してリクエストします。
const focusSession = await AudioFocusManager.createAudioFocusSessionAsync();
await focusSession.requestAudioFocusAsync({
    usage: AudioUsageType.USAGE_MEDIA
});

// フォーカスの変更通知に登録します。
await focusSession.registerAudioFocusListenerAsync((focusChange) => {
    console.log('フォーカスが変更されました:', focusChange);
});

イベントオブザーバー

オーディオマネージャーのイベント

クリップボードにコピーしました。

// システム全体のオーディオイベントに登録します。
await AudioManager.registerAudioEventObserverAsync((event) => {
    // イベントオブジェクトには、イベントタイプに基づいてさまざまなプロパティが格納されます。
    switch (event.audioEvent) {
        case AudioEvent.DEVICE_STATE_UPDATE:
            // オーディオデバイスの接続状態が変更されたときにトリガーされます。
            // パラメーター:
            // - device: AudioDevice列挙値
            // - role: AudioRole列挙値
            // - connect:デバイスが接続されたか(true)、切断されたか(false)を示すブール値
            console.log(`デバイス${event.device}(ロール${event.role})が${event.connect ? '接続' : '切断'}されました`);
            break;

        case AudioEvent.VOLUME_UPDATE:
            // いずれかのオーディオタイプの音量が変更されたときにトリガーされます。
            // パラメーター:
            // - type: AudioVolumeType列挙値
            // - volume:数値(0~100)
            console.log('音量が変更されました。タイプ:', event.type, '、音量:', event.volume);
            break;

        case AudioEvent.GLOBAL_VOLUME_MUTE_UPDATE:
            // グローバルのミュート状態が変更されたときにトリガーされます。
            // パラメーター:
            // - mute:システムがミュートになっているかどうかを示すブール値
            console.log('グローバルのミュート状態が更新されました:', event.mute);
            break;

        case AudioEvent.SERVER_DOWN:
            // オーディオサーバーが利用不可能になったときにトリガーされます。
            console.log('オーディオサーバーがダウンしました');
            break;

        case AudioEvent.SERVER_UP:
            // オーディオサーバーが利用可能になったときにトリガーされます。
            console.log('オーディオサーバーが稼働しました');
            break;

        case AudioEvent.AUDIO_USAGE_STATE_CHANGE:
            // オーディオの使用状態が変更されたときにトリガーされます。
            // パラメーター:
            // - usage: AudioUsageType列挙値
            // - active:使用タイプがアクティブになったかどうかを示すブール値
            console.log('使用タイプ:', event.usage);
            console.log('アクティブ状態:', event.active);
            break;

        case AudioEvent.MIC_MUTE_STATE_UPDATE:
            // マイクのミュート状態が変更されたときにトリガーされます。
            // パラメーター:
            // - state:マイクがミュートになっているかどうかを示すブール値
            console.log('マイクのミュート状態が変更されました:', event.muteState);
            break;

        case AudioEvent.VOLUME_MUTE_UPDATE:
            // 特定の音量タイプの音量ミュート状態が変更されたときにトリガーされます。
            // パラメーター:
            // - volumeType: AudioVolumeType列挙値
            // - mute:タイプがミュートになっているかどうかを示すブール値
            console.log('音量タイプ:', event.volumeType);
            console.log('ミュート状態:', event.muteState);
            break;

        case AudioEvent.TELEPHONY_MUTE_UPDATE:
            // 電話のミュート状態が変更されたときにトリガーされます。
            // パラメーター:
            // - deviceType: AudioDevice列挙値
            // - address:デバイスアドレスを表す文字列
            // - deviceName:デバイス名を表す文字列
            // - mute:電話がミュートになっているかどうかを示すブール値
            console.log('電話のミュート状態が更新されました:');
            console.log('デバイスタイプ:', event.deviceType);
            console.log('デバイスアドレス:', event.deviceAddress);
            console.log('デバイス名:', event.deviceName);
            console.log('デバイスのミュート状態:', event.muteState);
            break;
    }
});

// クリーンアップします。
await AudioManager.unregisterAudioEventObserverAsync();

ストリームの再生

クリップボードにコピーしました。

const playbackStream = await builder.buildAsync();

await playbackStream.registerEventObserverAsync((event) => {
    switch (event.type) {
        case AudioPlaybackEvent.DIED:
            // 再生ストリームが利用不可能になったときにトリガーされます。
            break;

        case AudioPlaybackEvent.RECOVERED:
            // 再生ストリームが利用不可能な状態から回復したときにトリガーされます。
            break;

        case AudioPlaybackEvent.STOPPED:
            // 再生ストリームが停止したときにトリガーされます。
            break;

        case AudioPlaybackEvent.MUTE_STATE_UPDATE:
            // ストリームのミュート状態が変更されたときにトリガーされます。
            // パラメーター:
            // - muted:ストリームがミュートになっているかどうかを示すブール値
            console.log('ミュート状態:', event.muteState);
            break;

        case AudioPlaybackEvent.FRAME_UNDERRUN:
            // バッファーアンダーランが発生したときにトリガーされます。
            // パラメーター:
            // - size:アンダーランのサイズをフレーム数で示す数値
            console.log('アンダーランの数:', event.underrunCount);
            break;
    }
});

// クリーンアップします。
await playbackStream.unregisterEventObserverAsync();

オーディオフォーカス

クリップボードにコピーしました。

const focusSession = await AudioFocusManager.createAudioFocusSessionAsync();

await focusSession.registerAudioFocusListenerAsync((focusChange) => {
    switch (focusChange.type) {
        case AudioFocusChange.GRANTED:
            // オーディオフォーカスが付与されたときにトリガーされます。
            break;

        case AudioFocusChange.RELEASED:
            // オーディオフォーカスが解放されたときにトリガーされます。
            break;

        case AudioFocusChange.DUCKED:
            // オーディオをダッキングする(音量を下げる)必要があるときにトリガーされます。
            break;

        case AudioFocusChange.PAUSED:
            // オーディオを一時停止する必要があるときにトリガーされます。
            break;

        case AudioFocusChange.STOPPED:
            // オーディオを停止する必要があるときにトリガーされます。
            break;
    }
});

// クリーンアップします。
await focusSession.unregisterAudioFocusListenerAsync();

トラブルシューティング

  1. 権限に問題がある:
    1. エラー: 「No Permission exception」
    2. 解決策: manifest.tomlで、必要な権限が正しく宣言されていることを確認してください。
  2. AudioManagerが作成されない:
    1. エラー:「getAudioManager() returns undefined」
    2. 解決策: アプリの環境で、KeplerAudioInterfaceターボモジュールが正しくセットアップされ、サポートされていることを確認してください。
  3. オブザーバーまたはコールバックが無効:
    1. エラー:「not invoking Callback」
    2. 解決策: オブザーバーに正しくサブスクライブしていることを確認してください。
  4. サブスクリプションの解除に失敗する:
    1. エラー: 「Unsubscribe rejection」
    2. 解決策: 正しいオブザーバーオブジェクトを使用していること、そのオブジェクトがまだサブスクライブ解除に使用されていないことを確認してください。

関連リソース

ドキュメント

列挙型

クラス


Last updated: 2025年10月2日