0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Alexa スキルをパーソナライズする

Posted at

パーソナライズを試してみた。

スキルをパーソナライズするとは

1つのAmazonアカウントに複数のEchoデバイスが登録されていて、さらに複数人(家族とか)で使用する場合、複数人のプロファイルを登録しておくと、Alexaはユーザーを識別することができるようになる。
スキルのパーソナライズ機能を使用すると、共有アカウントを使用せず、それぞれのスキルユーザーが各自のアカウントにリンクできるようになるので、その人にあったエクスペリエンスが提供できるようになる。

パーソナライズ機能を使うには

パーソナライズ機能を有効にする

Alexa Developer Consoleで ツール アクセス権限 から スキルのパーソナライズ をオンにする。

image.png

Alexa Developer Console を使ってない場合は、skill.json の、permissionsalexa::person_id:read を追加することで使用できるようになる。

パーミッション
    "permissions": [
      {
        "name": "alexa::person_id:read"
      }
    ],

パーソナライズを有効することで以下のように userオブジェクトのほかに、personオブジェクトがAlexaからのリクエストに含まれるようになる。

アカウントリンクなしの場合
"person": {
    "personId": "amzn1.ask.person.AKYSF36TDUMFU2FR55OJTXO5B53QVL2RZY37C5AOFV6FG2TORRK574KTJ62BAFTP32HZGGSX3SPNLLTMZM4ZBOSMKDGRGU7RGDMUKU3E",
    "authenticationConfidenceLevel": {
        "level": 200
    }
},
"user": {
    "userId": "amzn1.ask.account.AG3ULPXTOC7KLBQJVJMISQX6L25DVFQXO2ZYTOKDDWES3M2UTH5WDCTSY2SAKNFSGI7BDQWWRFS5NOEQMCPY3LBOE5NN2M6QIS43RBKGDQG3PV6QLNJMQSXONM6HUTIFG7GK4MWEB7RDDZ32NDVMVRFXP6L6ZI433SCXBEM3XNX57XT4MB25T4UA3EPJZ6UAWOBAH6RIY3NVODI"
},

user がアカウントレベルなのに対して、person が個人レベルの情報となる。
アクセス権限とレベルの関係は以下。スキルで使用したい権限を、Alexa Developer Console または、skill.json で設定する。

権限 permissions 同意レベル
名前 alexa::profile:given_name:read アカウントレベルと個人レベル
姓名 alexa::profile:name:read アカウントレベルと個人レベル
携帯電話番号 alexa::profile:mobile_number:read アカウントレベルと個人レベル
メール alexa::profile:email :read アカウントレベルのみ
郵便番号 alexa:devices:all:address:country_and_postal_code:read アカウントレベルのみ
位置情報 alexa::devices:all:geolocation:read アカウントレベルのみ
タイマー alexa::alerts:timers:skill:readwrite アカウントレベルのみ
リマインダー alexa::alerts:reminders:skill:readwrite アカウントレベルのみ

個別にアカウントリンクも可能

アカウントリンクすることで、オブジェクトのaccessToken にトークンが含まれるようになる。個人レベルでアカウントリンクを設定しておくことで、個別にアカウントリンクが可能となる。アカウントと個人が同じ場合はトークンも同じ。違う場合はトークンも別となる。

アカウントと同じユーザー
"person": {
    "personId": "amzn1.ask.person.AISODKWGQZUAKL5ONZHR7DRR7576FTWATG6IZRSGM6OJXLHD4RJMV6KRXZQHBNFMIYVUE5AGBZLE4K2G2WFJXEAHWMZF3LYZZ6WPS7ZW",
    "accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5NzIyNzJmMC1iN2I4LTQxNjgtYjdjNi1jMGZiMmQ4NGJiYWYiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5NzkzOTcsImV4cCI6MTY1Nzk4Mjk5NywiaWF0IjoxNjU3OTc5Mzk3LCJqdGkiOiI4NGEwZjQ3MS1iYTI2LTRhNzktOTBlNC0zY2JmYWY3ZjQ1MmIiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFmM3pwejN6M3lsbDQyeTZ2eTV0enMzdHNoeHEifQ.imGLUyJRfFGOzOIV2s13LjKJiYYw6loRnFpQ6cKQpBiPzB8eskfVuqM8Su_WXl3tvkVeE7aEe-3PUG_dPbfyjUN4Ok_Iw_7uy2o3TvrH-6HqTWVluABPbdycwvL8sA81J-CEMs9YmlhG90NxirSRiMgnlqnve5iLvP9rBtVC0nu-eC9xhWNFYp95PBFsE1ZYwVNMLRIuaZN7eXsCa_8U_BZ2zIbndjTsSR1PXMXSt0tiV__yw0BrUkZ8Lrwi8y3J-jamL438CVimh3SOu83zfgtX_KSuet7rgXtYXqqURc4vokhvGr2oLgoY9mYRXybgZmeuAto0tn5wfCzQxJV99Q",
    "authenticationConfidenceLevel": {
        "level": 300
    }
},
"user": {
    "userId": "amzn1.ask.account.AFXWSL2YEKZJLNGKGF4ZP7BERCTML6SVOM5OAKZ5EPD5HTMRFX4MEBCIKEKP2JBMR4WSXULIKSJU4ZYAHXXAJFGFZ5VG2XJTEV5FUJMTS5DKP6AK4UKSLDKBECOTSLTQHMWLK2XWSAZEWWRGJWCBWGGCPW4QFJNVXUOXXWKP57CJGNGGMN3GT5PVH724Y3LYVGG2EFQ3QL77K3I",
    "accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5NzIyNzJmMC1iN2I4LTQxNjgtYjdjNi1jMGZiMmQ4NGJiYWYiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5NzkzOTcsImV4cCI6MTY1Nzk4Mjk5NywiaWF0IjoxNjU3OTc5Mzk3LCJqdGkiOiI4NGEwZjQ3MS1iYTI2LTRhNzktOTBlNC0zY2JmYWY3ZjQ1MmIiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFmM3pwejN6M3lsbDQyeTZ2eTV0enMzdHNoeHEifQ.imGLUyJRfFGOzOIV2s13LjKJiYYw6loRnFpQ6cKQpBiPzB8eskfVuqM8Su_WXl3tvkVeE7aEe-3PUG_dPbfyjUN4Ok_Iw_7uy2o3TvrH-6HqTWVluABPbdycwvL8sA81J-CEMs9YmlhG90NxirSRiMgnlqnve5iLvP9rBtVC0nu-eC9xhWNFYp95PBFsE1ZYwVNMLRIuaZN7eXsCa_8U_BZ2zIbndjTsSR1PXMXSt0tiV__yw0BrUkZ8Lrwi8y3J-jamL438CVimh3SOu83zfgtX_KSuet7rgXtYXqqURc4vokhvGr2oLgoY9mYRXybgZmeuAto0tn5wfCzQxJV99Q",
    "permissions": {
        "consentToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLmZkMmU3NGJkLTY2MWItNDk4MS04NDkxLWJiYjA5ZmUwNmMxOSIsImV4cCI6MTY1Nzk4NTA3OCwiaWF0IjoxNjU3OTgxNDc4LCJuYmYiOjE2NTc5ODE0NzgsInByaXZhdGVDbGFpbXMiOnsiaXNEZXByZWNhdGVkIjoidHJ1ZSIsIm5vbkx3YVNjb3BlcyI6ImFsZXhhOjphdXRoZW50aWNhdGU6MjptYW5kYXRvcnksYWxleGE6OnBlcnNvbl9pZDpyZWFkIiwiY29uc2VudFRva2VuIjoiQXR6YXxJd0VCSUF5OE5DTzZpS2lkOGt5UEFIbWduSUJzNGlTOHhJOUlCa0NNd2JXb3RCbU1aU09UTlJZaE9FTFVaWThYLVdpS3F5RUxmeUtBbHpFQjZqZ2Ixc2JqaWFidTJnbXZObE9WTkozWW1MVTJBS3lXMXU2QTFxQ1BUQTJ0YmE4aUdFWC1BY253WnQxcHV1eGQ3T2tzRGVxZjhaTGtNOEtmMlJ5RGw4RS1mRFNRTmV1WERfU1dNSkJJbmZFdHpsZThZVWY4SGpkLVFKNU1mcjIyU3hFcjVKN1lCbVl6YkxBVHM4N2g0Tm85N1NNYk4xNlp0eTBNM2UyVlpqZm40UE9GRmJ5bHBvMXdRQ2p6VDNsSXpyZTNBcGxQbVRHU1FuWElkODRJVXZySmo2Y3lvVk1MTldfbHpRZGFKa0Z6TWNOVUpDZEE3YVFRVFFzZzB6UlkxSjRjUlFMM2xEUUYiLCJkZXZpY2VJZCI6ImFtem4xLmFzay5kZXZpY2UuQUVXQUNZT0dRQ1RTVEFaUjdEVk9JNU1DVVIzTFNZSFBMNEhYQkJCUFZNSFIzNlZOSEU2N01ZTERHWDJPS1lFSk5RRDM2NzdXRTRRQVlFRElGWjJDVEtXUkVVWTZHRVNBRVVKWEhBMlNKMjNZTklTV001S1kzSUlXVUFPWkJBREZHTEpCUFRNUzc3TTRPWU9GVDZOVlQ1NDU2WkJCSk5PQ09ST1pQMlRPV0NGR1o0TEJLRVNYQSIsInVzZXJJZCI6ImFtem4xLmFzay5hY2NvdW50LkFGWFdTTDJZRUtaSkxOR0tHRjRaUDdCRVJDVE1MNlNWT001T0FLWjVFUEQ1SFRNUkZYNE1FQkNJS0VLUDJKQk1SNFdTWFVMSUtTSlU0WllBSFhYQUpGR0ZaNVZHMlhKVEVWNUZVSk1UUzVES1A2QUs0VUtTTERLQkVDT1RTTFRRSE1XTEsyWFdTQVpFV1dSR0pXQ0JXR0dDUFc0UUZKTlZYVU9YWFdLUDU3Q0pHTkdHTU4zR1Q1UFZINzI0WTNMWVZHRzJFRlEzUUw3N0szSSJ9fQ.foe0R-LEvW-Yp4uSKhSO94wJf3wXGZV5xNTCwDi8tuEtbPOGF2dXgZCly8uG1gbIFTtbeN4MfOhJFInhHDxxa7wg0ut4HUrTnUbAQaI8qz_zD-9t4zpwDWCMtdoEm1AzarixTGfyLflztB5XbXRsiF8S6j1Oa16sZEzmGR9whqlpSVOTnfK1jcM_MY-8S7_nsXQVlJqMbSBZQujBnYr9Z1cagOfv5H2cXZrvdXJ6HwFdfwD6-aQosWwsrb3NIfCSQUhU6byPjCumMffqejpszzO5LJpLZvmrNhmyvpj_b-YHKF395TuIc46_ApFsH28cSoMes9bdG_JDygQL7p3JwA"
    }
},
アカウントと違うユーザー
"person": {
    "personId": "amzn1.ask.person.AI3DUTIDNDS7OICLU75YBHOKCTCVZGP5ZEGBIXS5HN3GJEFPZNL3KI2PKC7YQTW46I4EOOI5W5NNINCLBEWBJEKYOI3ZJHVVNNB2WV2I",
    "accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNDI2NzYyNC0zM2U4LTQ3ZTAtYTJjYy1jZTY3OTg3N2JhMTYiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5NDY1MjksImV4cCI6MTY1Nzk3ODg0OCwiaWF0IjoxNjU3OTc1MjQ4LCJqdGkiOiI0ZjFiN2ZkNS1mYjdlLTRkMDItYmY4Yy03ZDU0OWZhNGQ2YTYiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFleGlwYTVwa3Vwd2R3MjR4NmZ4YjR0MnlndGEifQ.gCfjUXPYWAMttnLHWgyOy7xQ_k0PwOM47eIRC5wKNJmfasbzJihL-Udco6bT075y4ND4mx3JemZRXF_UTg0HWr9S31ZZWD8AX6DSwq8NrOkZhGc8lNLyao6BGhywKijd8ZkRmyErf0YiHXdVStEddrtvarweN7ue350Lho-BFErshzyyjKI5-yPt8BpmS13GwQdfu4vB2_3boahtJZBSVKxYVdr83jALs_EZYQCcJMJuaTUIxE8ZNcax8x8kXmYYA-BHvdGd1zdbUn8iMs3BUvKW7jVB3PhCydocNaokzffFr5QUjX-geRwUtAjpovw-l1eOGmY0VfFPiioHt3Z8vg",
    "authenticationConfidenceLevel": {
        "level": 300
    }
},
"user": {
    "userId": "amzn1.ask.account.AG2ORE4QGWIFWQR362EG2TWAQRYZQ7URETA4A7VHIBKOMAQ3SV2GMCZW4PHAKBAAYSRBYUTYM3BQRUVWXQRTP6ITWLBBUVNVM5YE476EXJP2LIUR3X4DJ2FMSLFZA3BJL44HCC5A4MA76WUULMPDLBOHLSN3HP3NDF6P3VQXGU3H57ZOJ6BCWIKBGQE373EH4RGUMZD5KYUS2BQ",
    "accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI2MmUzNDI1MS0wZjg1LTRiMDAtODU5NS03MTA1YzA4NTk0MmIiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5MzkxOTQsImV4cCI6MTY1Nzk3NzU5NiwiaWF0IjoxNjU3OTczOTk2LCJqdGkiOiJiZGNkZmFjMC05Yjg4LTQ0MjUtOWZjZC0yOTc3YTBhNzAyNjkiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFlNzN5Z3ZqZWl5eGp5aDNndWQ1MmJiY2FqZ2EifQ.CUIpggDSue7TtRlUofq-tnyVfZGTSLYYtT5XUyrgBKSWM6YTZy-GQ-acARjgB7FTal8HR4GZKtYU1mNXVfjIHJ2TIbhtvHTAztXuFOo2kcz46q_Ur8fvym6FN6h-HpxJ9x5JZgW3PINOKfL0iKTHhwXtFs4QURezEK49ugyB9FvY6Hd4KbHy_gzbjMF8E3OgnTFdz8ejKLUnM-7cE3Q0wsJKWLZf8CmadPTh39rkXYfOQg-DN2TyfkuSBnFybSCXmsQK6XFRt1r0FNREQhPmsvrLaAC7AwXtHETGxqgwkuVAr9m9AlukSf8THxeKk4aFYattbOv0HgLAWKjQFd9yqw",
    "permissions": {
        "consentToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLmZkMmU3NGJkLTY2MWItNDk4MS04NDkxLWJiYjA5ZmUwNmMxOSIsImV4cCI6MTY1Nzk4MDIyNywiaWF0IjoxNjU3OTc2NjI3LCJuYmYiOjE2NTc5NzY2MjcsInByaXZhdGVDbGFpbXMiOnsiaXNEZXByZWNhdGVkIjoidHJ1ZSIsIm5vbkx3YVNjb3BlcyI6ImFsZXhhOjpwZXJzb25faWQ6cmVhZCIsImNvbnNlbnRUb2tlbiI6IkF0emF8SXdFQklGdW9pbzdCSXk1TElxcGNlMHp5SmprbVRqWnVpODFTWUhBeWowNlhDZUNKWDFhV2RPd25leUF1cFNJX2RKNG5OQTdnWUwzWVdMMHJlc1lOczQyZGx2RXhtYXdMZDAyS2Y1bkRiYW4zX09OS29fWUhYaUdVQXVSdnMyUmxNNklNUTVjRTdIVS1KOHllblJXMGFZU3BHSjJLdnI0bWR1Z3pZNnlVNXBtREpqZk5wTnNweVpSM0tnU3RWb3ZsQmY5VzBBd2ZYcExOMFdJNHlaRHRVSEN1RG1aNnRKSHlzd2FYdnpSWkV3ZHZVWlU1cjFuam41ZGZnRlJGN2FlQThFSDVlWTB1OXNDcTYwZVhlWjJ0UF9uLWtHUkdSWGViRnROcU91b1lVNl9IeEFiWEJrY2YwSW5HMDlyREN6NWFwUlc5VE5hSHNEbVFwWWFMTms3MHo0MlQtV2JZIiwiZGV2aWNlSWQiOiJhbXpuMS5hc2suZGV2aWNlLkFGRVZCTU5ENTRZSUVYU1VZTUZHVDVXWlU0UVBMMkJCV09aU1RMQ0ZOMk9SVlJITkwyS0ZRM0ZSR0JDUlNXRFdPUUk0VlIyR0FWMzNJUFRXQlJWSTZFWjNOQURFNkoyQkZEQVU2Q0JYS042UFA2QVpLS1BFTDU1VUlIU0FISFVMSENQM0ZZNldSUEdMVkhXN0szU1NTNjYzM1VHWkg1VFU3VU5LSEZKSUo2UTRNVlZIVkMzTFkiLCJ1c2VySWQiOiJhbXpuMS5hc2suYWNjb3VudC5BRzJPUkU0UUdXSUZXUVIzNjJFRzJUV0FRUllaUTdVUkVUQTRBN1ZISUJLT01BUTNTVjJHTUNaVzRQSEFLQkFBWVNSQllVVFlNM0JRUlVWV1hRUlRQNklUV0xCQlVWTlZNNVlFNDc2RVhKUDJMSVVSM1g0REoyRk1TTEZaQTNCSkw0NEhDQzVBNE1BNzZXVVVMTVBETEJPSExTTjNIUDNOREY2UDNWUVhHVTNINTdaT0o2QkNXSUtCR1FFMzczRUg0UkdVTVpENUtZVVMyQlEifX0.ZQJo0Z0mf_Uz9pHPKnBfiwJ4wZPeVxRi_uiJE3g8YGPHf7wnIEWGJLbLRBZILX1I0vQbJZfa-H1M2WbeaTW4qh2Zdkxx9QrdihKSV6Ow43gDDBP2Rj3gxHVfNJTy065pPxhUDkGQJIlwUF8IDfeZrhKk8t_8zweah4WYtvfOVXENCzfrvVFmvTgvzFZwI8E9P2yVjSVOqPop8OScSYQyr6zIoBV0kM0Lnu7q4Cjicn8GVYcJIeRArIUZKQsCrONzVE9TZ8YP7oCYNVyAct-LNiiqlsXXlZezmitOS1jSeD633LKkPAeWodwGpuwQ3olzFLi5pxhuQpzQEQHT8H9Fow"
    }
},

個別にPIN設定も可能

PINを有効にすることで、個人レベルでPINが使えるようになる。
ただし、現在は日本のスキルではPIN登録できないみたい。Alexaアプリのスキルページに PIN が表示されない。

実装

  • Alexaアプリで 音声ID を追加する
  • スキルのパーソナライズ をオンにする
  • 取得したい権限をオンにする
  • バックエンドコードを書く
    • personオブジェクトを取得する
    • 権限情報を取得する
  • (デプロイ)
  • Alexaアプリでスキルを有効にする
    • 権限の参照を許可する

音声IDを追加する

Alexaアプリから音声IDをセットアップする。アプリの指示に従ってIDを登録する。

音声IDをセットアップ

パーソナライズをオンにする

image.png

取得したい権限をオンにする

image.png

バックエンドコードでpersonオブジェクトを取得する

person オブジェクトは handlerInput から取得できる。名前を喋らせたいだけならこれだけでOK。
パーソナライズがオンにすることで、person オブジェクトが取得できるようになるので、そのオブジェクトから personId を取得する。

let user = handlerInput.requestEnvelope.context.System.user;
let userId = user.userId;
let person = handlerInput.requestEnvelope.context.System.person;
let personId = (person === undefined) ? '' : person.personId;

個人レベルの情報が取得できるかは、person オブジェクトのありなしで判断する。
person オブジェクトからpersonId が取得できたら、SSMLを使って名前を発話させることができる。

<alexa:name type="first" personId="<personId>" />

if (person === undefined) {
    speakOutput = '<speak>おはようございます。今日の朝食用にパンケーキのレシピを用意しました。</speak>';
} else {
    speakOutput = '<speak><alexa:name type="first" personId="' + personId + '" />さん、おはようございます。今日の朝食用にパンケーキのレシピを用意しました。</speak>';
}

バックエンドコードで権限情報を取得する

パーソナライズ情報を取得するには serviceClientFactory を使用する。 SMAPIを使っても可能だが実装が簡単なので今回はこれを使用した。

try {
    const client = handlerInput.serviceClientFactory.getUpsServiceClient();
    const name = await client.getPersonsProfileName();
} catch (error) {
    if (error.name !== 'ServiceError') {
        return handlerInput.responseBuilder
            .speak('サービスクライアントエラーです')
            .getResponse();
    }
    return handlerInput.responseBuilder
       .speak('権限がありません。')
       .getResponse();
}

SkillBuilderswithApiClient を追加しておかないと動かない。いつもこれを忘れてしまうのでメモしておく。

exports.handler = Alexa.SkillBuilders.custom()
   :
    .withApiClient(new Alexa.DefaultApiClient())

スキルの作成が完了したら、スキルをデプロイする。

Alexaアプリでスキルを有効化し権限の参照を許可する

スキルを有効にすると、プロフィールのアクセス権と、アカウントのアクセス権が聞かれる。

スキルを有効にする プロフィールのアクセス権 アカウントのアクセス権

もちろん、アカウントリンクもできる。

スキルの設定 アカウントリンク アカウントリンク成功

ユーザーごとにアカウントリンクもできる。
2番目のユーザーがアカウントを追加 ではなく、普通にアカウントリンクをするとデフォルトが変わる。

それぞれアカウントリンク

これはいろいろ活用できそうだ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?