web-dev-qa-db-ja.com

Alexaでオーディオをストリーミングする最も簡単な例

新しいストリーミングオーディオAPIを実行しようとしています。次の応答は有効ですか?デバイスでテストすると、「スキルに問題がありました」というエラーが表示されます。

これが私のAWS-lambda関数のコードです。

def lambda_handler(event, context):
    return {
        "response": {
            "directives": [
                {
                    "type": "AudioPlayer.Play",
                    "playBehavior": "REPLACE_ALL",
                    "audioItem": {
                        "stream": {
                            "token": "12345",
                            "url": "http://emit-media-production.s3.amazonaws.com/pbs/the-afterglow/2016/08/24/1700/201608241700_the-afterglow_64.m4a",
                            "offsetInMilliseconds": 0
                        }
                    }
                }
            ],
            "shouldEndSession": True
        }
    }
13
maxymoo

次のコードは私のために働きました:

def lambda_handler(event, context):
    return {
        "response": {
            "directives": [
                {
                    "type": "AudioPlayer.Play",
                    "playBehavior": "REPLACE_ALL",
                    "audioItem": {
                        "stream": {
                            "token": "12345",
                            "url": "https://emit-media-production.s3.amazonaws.com/pbs/the-afterglow/2016/08/24/1700/201608241700_the-afterglow_64.m4a",
                            "offsetInMilliseconds": 0
                        }
                    }
                }
            ],
            "shouldEndSession": True
        }
    }
]

唯一の違いは、URLがhttpではなくhttpsであることです。

スキルシミュレータで機能しない場合でも、後回しにしないでください。ストリーミングオーディオで動作するようにまだアップグレードされていません。ディレクティブはそこには表示されません。ただし、デバイスで使用すると機能するはずです。

17
Joseph Jaquinta

AudioPlayerを使用する最も簡単な方法を示す非常にシンプルなプロジェクトをGithubに作成しました。
https://github.com/bespoken/super-simple-audio-player

ここでは、そのための記事も作成しました。
https://bespoken.tools/blog/2017/02/27/super-simple-audioplayer

このプロジェクトは、トラックの再生方法と、一時停止および再開の方法を示しています。

次に、オーディオファイルの実際の再生を示すコードを示します。

SimplePlayer.prototype.play = function (audioURL, offsetInMilliseconds) {
    var response = {
        version: "1.0",
        response: {
            shouldEndSession: true,
            directives: [{
                type: "AudioPlayer.Play",
                playBehavior: "REPLACE_ALL", // Setting to REPLACE_ALL means that this track will start playing immediately
                audioItem: {
                    stream: {
                        url: audioURL,
                        token: "0", // Unique token for the track - needed when queueing multiple tracks
                        expectedPreviousToken: null, // The expected previous token - when using queues, ensures safety
                        offsetInMilliseconds: offsetInMilliseconds
                    }
                }
            }]
        }
    }

    this.context.succeed(response);
};
3
John Kelvie

プログラムは、「LaunchRequest」と「SessionEndedRequest」に対して何らかの応答を返す必要があります。そうしないと、「要求されたスキル応答で問題が発生しました」と表示されます。

インテント「PlayMusic」を追加し、ファイルのURLを変更する必要があります。

追伸どのversionbuild_audio_response関数に含めるかわかりません。jsonを here から取得しました

def build_audio_response(url):
    return {
        "version": "1.01",
        "response": {
            "directives": [
                {
                    "type": "AudioPlayer.Play",
                    "playBehavior": "REPLACE_ALL",
                    "audioItem": {
                        "stream": {
                            "token": "12345",
                            "url": url,
                            "offsetInMilliseconds": 0
                        }
                    }
                }
            ],
            "shouldEndSession": True
        }
    }

def handle_session_end_request():
    return {
        "version": "1.0",
        "response": {
            "shouldEndSession": True
        }
    }

def play_music(intent, session):
    url = "https://s3-eu-west-1.amazonaws.com/bucket/filename.mp3"
    return build_audio_response(url, should_end_session=True)

def on_intent(intent_request, session):
    """ Called when the user specifies an intent for this skill """

    intent = intent_request['intent']
    intent_name = intent_request['intent']['name']

    if intent_name == "PlayMusic":
        return play_music(intent, session)
    Elif intent_name == "Amazon.CancelIntent" or intent_name == "Amazon.StopIntent":
        return handle_session_end_request()
    else:
        raise ValueError("Invalid intent")

def lambda_handler(event, context):
    if event['request']['type'] == "LaunchRequest":
        return {
            "version": "1.0",
            "response": {
                "shouldEndSession": False
            }
        }
    Elif event['request']['type'] == "IntentRequest":
        return on_intent(event['request'], event['session'])
    Elif event['request']['type'] == "SessionEndedRequest":
        return handle_session_end_request()
0
armicron