Amazon Developer Blogs Amazon Developer Blogs 2018-07-20T19:14:01+00:00 Apache Roller Weblogger /blogs/appstore/post/28441cc2-c8d8-470d-8486-73ab9ed28a5c/success-story-eden-games-increases-gear-club-s-tournament-retention-by-20-with-gameon Success Story: Eden Games Increases Gear.Club's Tournament Retention by 20% with GameOn Emily Esposito Fulkerson 2018-07-20T18:06:08+00:00 2018-07-20T19:14:01+00:00 <p><img alt="Gearclub-casestudy-hero-0720.png" src="" /></p> <p>Compared to other tournaments they ran in the past, Eden Games reports a 20% increase in retention when real-world prizes were offered via GameOn.</p> <p><img alt="Gearclub-casestudy-hero-0720.png" src="" style="display:block; height:311px; margin-left:auto; margin-right:auto; width:700px" /><br /> We can't all race McLarens down city streets, but we can get one step closer with <a href="" target="_blank">Gear.Club</a>, the ultimate racing game by Eden Games. Gear.Club creates a realistic driving experience, letting you collect the most gorgeous and powerful cars in your performance shop and competing live with your friends through unlimited races, championships, and events.<br /> <br /> Their challenge: bring new users to their game and increase engagement of current players to result&nbsp;in more driving time. To accomplish this, they integrated Amazon GameOn to easily run cross-platform tournaments, including leaderboards, and to award players with real-world prizes fulfilled by Amazon.</p> <p>&nbsp;</p> <p><img alt="gameon-gearclub-casestudy-0720.png" src="" style="display:block; height:349px; margin-left:auto; margin-right:auto; width:700px" /><br /> <br /> “We found the idea of rewarding tournaments with physical products shipping from to be a very compelling proposition for the mobile esports ecosystem,” said David Nadal, CEO of Eden Games. “There's obviously no better partner in the world than Amazon to execute on that vision, taking into consideration the logistics behind the scenes.”</p> <h2>Real-world prizes lead to a boost in tournament retention</h2> <p>In March 2018, Eden Games ran its U.S. Series Tournament in Gear.Club, inviting players to race to the top of the leaderboard for a chance to win an Amazon Echo device. While big cash pools may be successful with PC games, David has seen more success with real-world prizes in mobile games.<br /> <br /> “We are totally in love with the idea of offering physical products to reward competitive mobile gaming. Physical and tangible beats digital when it comes to rewarding players for major achievements. And, real-world prizing feels more playful than straight cash,” said David.<br /> <br /> And, with shorter tournament cycles and more regular chances to win prizes, players are incentivized to keep coming back.<br /> <br /> “They were quite excited about the prospect of winning a device!”<br /> <br /> This excitement is leading to real business results. Compared to other tournaments they ran in the past, Eden Games reports a 20% increase in retention when real-world prizes were offered via GameOn.</p> <h2>No client-side updates required</h2> <p>With a set of flexible APIs built on the AWS cloud infrastructure and compatible with any operating system, GameOn was easy to integrate into Gear.Club's esports tournament design.<br /> <br /> “The GameOn APIs are easy to integrate and can certainly save any developer a lot of time compared to coding and maintaining a tournament system all by yourself. It's been well tested, scales to our needs, and works flawlessly” said David.<br /> <br /> Gear.Club's esports tournament design is essentially one live event composed of three races — each with independent leaderboards with a specific car.</p> <p>&nbsp;</p> <p><img alt="Esport_Introduction_World_Gearclub_Casestudy_0720.png" src="" style="display:block; height:394px; margin-left:auto; margin-right:auto; width:700px" /><br /> <br /> Given the GameOn APIs, David achieved this by creating three GameOn tournaments (one for each race) with the following specifications:</p> <pre> <code>{ ... &quot;matchesMax&quot;: 1, &lt;-- All players should enter the same match to compete against each other &quot;matchesPerPlayer&quot;: 1, &lt;-- Obviously, there can only be one match per player&quot;playerAttemptsPerMatch&quot;: 32767,&lt;-- We want players to be able to improve their time infinitely so we initialize this field to the max allowed value &quot;playersPerMatch&quot;: 1000000000, &lt;-- We want the whole world to play, so we initialize this field to the max allowed value &quot;scoreType&quot;: &quot;INDIVIDUAL&quot;, &lt;-- Individual scoring to take the best score submitted &quot;winType&quot;: &quot;LOWEST&quot;, &lt;-- Lowest to indicate to the API that the best score is the lowest one .... }</code></pre> <p>Eden Games decided to use a classic Java http client to connect to the GameOn API. This way, the server maintains the connection between the game's back-end and the player's client. This is invisible to the player and allows Eden Games to maintain the GameOn API code without disrupting the gameplay or forcing updates to the client.</p> <h2>A natural pillar for competitive mobile gaming</h2> <p>“GameOn is a natural pillar for us to execute our mobile vision. That's why we onboarded as a launch partner in full speed as soon as the lights went green,” said David.<br /> <br /> Competitive gameplay is inherent to the racing genre, thanks to the similarity between virtual racing and actual motorsport. However, David also thinks GameOn would be a strong match for any other competitive title.<br /> <br /> “If your title offers competitive gameplay, I would definitely recommend Amazon GameOn. Shipping physical goods comes with an extra layer that you couldn't even imagine building on your own.”<br /> <br /> “In a way, Amazon has been preparing for this since the late twentieth century. That's a pretty steep head-start in any kind of race!”</p> <h2>Get started with GameOn</h2> <p>Are you new to GameOn? <a href="" target="_blank">Get started today</a> in three easy steps: sign into GameOn console, register your game, and get your API key.<br /> <br /> You can also learn more about how to integrate competitive mobile gaming by watching <a href="" target="_blank">this webinar</a> on-demand.</p> <h2>About Eden Games</h2> <p><img alt="Edenlogo-0720.png" src="" style="display:block; height:226px; margin-left:auto; margin-right:auto; width:200px" /><br /> <a href="" target="_blank">Eden Games</a> was founded in Lyon, France in 1998 to develop one of the most successful game franchises on PlayStation systems: V-Rally. In 2000, the studio expanded its racing expertise with the development of Need For Speed: Porsche for EA. Eden Games experimented in other genres before returning to its roots with Test Drive Unlimited, the first massive open world racing game franchise.<br /> <br /> Eden Games today is managed by two of its original co-founders, David Nadal and Jean-Yves Geffroy. The studio is composed of experienced veterans and talented young developers, all driven by the same passion for cars, high-end design, and technology. Millennial Esports Corp owns 82.5% of the company.</p> /blogs/alexa/post/d14a5a94-52f3-43aa-a56c-6424a71d30be/reach-and-delight-more-customers-with-your-zigbee-certified-devices-and-amazon-alexa Reach and Delight More Customers with Your Zigbee Certified Devices and Amazon Alexa Brian Crum 2018-07-19T23:00:20+00:00 2018-07-20T02:25:59+00:00 <p><img alt="" src="" style="height:480px; width:1908px" /></p> <p>If you build lights, locks, or in-wall switches with Zigbee and certify with the Zigbee Alliance, you can easily add voice control with Alexa, and reach and delight more customers.</p> <p><img alt="" src="" style="height:480px; width:1908px" /></p> <p>Alexa is Amazon’s voice service and the brain behind tens of millions of devices. These include Amazon devices like the <a href=";qid=1521086388&amp;sr=8-1&amp;keywords=echo&amp;dpID=51LtByererL&amp;preST=_SY300_QL70_&amp;dpSrc=srch" target="_blank">Echo</a>, <a href=";qid=1521086494&amp;sr=8-3&amp;keywords=echo+plus" target="_blank">Echo Plus</a>, <a href=";hvadid=227508954212&amp;hvpos=1t1&amp;hvnetw=g&amp;hvrand=13313274161494088421&amp;hvpone=&amp;hvptwo=&amp;hvqmt=e&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=9032434&amp;hvtargid=kwd-310736619495&amp;ref=pd_sl_1foyxz097s_e" target="_blank">Echo Show</a>, and <a href=";qid=1521086388&amp;sr=8-5&amp;keywords=echo&amp;dpID=41%252BK4pC74XL&amp;preST=_SY300_QL70_&amp;dpSrc=srch" target="_blank">Echo Spot</a>, as well as a growing list of third-party devices with Alexa built-in, like the <a href=";ie=UTF8&amp;qid=1521086575&amp;sr=1-4&amp;keywords=sonos+one" target="_blank">Sonos One</a>. Customers have already connected tens of millions of smart home products to Alexa, and use their voices to control them millions of times each day. If you build lights, locks, or in-wall switches with Zigbee and certify with the Zigbee Alliance, you can easily add voice control with Alexa, and reach and delight more customers.</p> <h2>Using Echo Plus and Zigbee Technology to Remove Barriers to Smart Home Adoption</h2> <p style="margin-left:0in; margin-right:0in">We introduced the <a href=";qid=1527111483&amp;sr=8-1&amp;keywords=echo+plus&amp;dpID=41O7UvEzc8L&amp;preST=_SY300_QL70_&amp;dpSrc=srch" target="_blank">Echo Plus</a> last fall with a goal of making it simple for customers to create a smart home. <a href=";qid=1527111483&amp;sr=8-1&amp;keywords=echo+plus&amp;dpID=41O7UvEzc8L&amp;preST=_SY300_QL70_&amp;dpSrc=srch" target="_blank">Echo Plus</a> has a built-in hub that seamlessly connects and controls Zigbee smart devices, such as light bulbs, door locks, switches, and plugs, without the need for separate hubs or apps. Before Echo Plus, the typical customer installation of a smart product with Alexa could require up to seven steps involving both an application from the device maker and the Amazon Alexa application.</p> <p style="margin-left:0in; margin-right:0in"><img alt="" src="" style="height:700px; width:1242px" /></p> <p style="margin-left:0in; margin-right:0in">We simplified this process with Alexa, Echo Plus and Zigbee’s application layer for smart home devices. Now, customers can simply say “Alexa, discover my devices” and Echo Plus will discover and setup compatible Zigbee light bulbs, door locks, switches, plugs, and more.</p> <p style="margin-left:0in; margin-right:0in">This single-step process — which we call “Simple Setup” — reduces complexity and friction for customers and makes it easier for anyone to make their home smart. It also eliminates many of the “points of failure” that can impact the customer experience, as Zigbee devices connected directly to the Echo Plus aren’t reliant on other infrastructure including device maker mobile applications or cloud services.</p> <p style="margin-left:0in; margin-right:0in"><img alt="" src="" style="height:700px; width:1242px" /></p> <h2>Multiple Integration Options to Deliver Consistent, Rich Experiences</h2> <p>You can connect your Zigbee-based smart devices to Alexa using the Zigbee hub built-in to Echo Plus, or through other Zigbee Certified hubs such as SmartThings and Wink. These options give you the freedom to choose which aspects of a smart home solution you want to build, and the flexibility to support nearly any customer scenario, from those buying their first smart home device to those expanding an existing configuration.</p> <p>Once you’ve integrated with Alexa, your customers can use Alexa’s built-in smart home <a href="" target="_blank">voice user interface (VUI)</a> to control your smart devices. Using this built-in VUI makes your development easier and makes adoption easier for customers. Your customers can also use <a href="" target="_blank">Alexa Routines</a> and <a href="" target="_blank">Groups</a><em> </em>to integrate their smart home ecosystem seamlessly into their homes and daily lives. With Routines, they can trigger a series of actions for one or more devices using a single voice command, or automatically by time of day. With Groups, they can control the devices in the same room as an Echo device without having to remember specific device names.</p> <h2>Certify Your Devices to Reach and Delight More Customers</h2> <p>You can certify your Alexa-compatible products through the <a href="" target="_blank">Works with Alexa</a> (WWA) program to ensure an intuitive, hassle-free experience. Carrying the Works with Amazon Alexa badge also makes it easy for customers to discover your products on When your products are certified, they can carry the Works with Alexa badge, appear in the <a href="" target="_blank">Amazon smart home store</a>, and be considered for additional co-marketing opportunities.</p> <p>We recommend that Echo Plus customers look for products that are both Zigbee certified and certified via WWA. This ensures interoperability between devices, a consistent user experience, and the seamless adoption of your product into your customer’s daily lives.</p> <p>The business benefits of certification are substantial. When comparing the eight weeks before and after a smart device received WWA certification, the average units sold per week goes up by 53%. In addition, we see fewer customer returns when compared to similar smart home devices without WWA certification.</p> <p>To learn more about how to delight your customers with Alexa and how to pursue Works with Alexa certification, visit the <a href="" target="_blank">Smart Home Development with Zigbee</a> page.</p> <p>We can’t wait to see what you build.</p> /blogs/appstore/post/df6c8b92-a474-446f-87fa-252e3cc93686/object-type-introspection-in-gamemaker-part-2 Object Type Introspection in GameMaker - Part 2 Emily Esposito Fulkerson 2018-07-18T17:53:33+00:00 2018-07-18T17:53:33+00:00 <p><img alt="Object-introspection-image1-0718.png" src="" style="display:block; height:506px; margin-left:auto; margin-right:auto; width:900px" /></p> <p>In<a href=";ch=Inf&amp;chlast=Inf&amp;pub=AlH&amp;publast=AlH&amp;type=org&amp;typelast=org" target="_blank">&nbsp;part one</a> of this article series, we created our database and used it to display the values of each variable on the GUI. We only covered how to add basic data types as well as enums and other objects. This time, we will do some modifications to the original database.</p> <p><img alt="Object-introspection-image1-0718.png" src="" style="display:block; height:506px; margin-left:auto; margin-right:auto; width:900px" /></p> <p>In<a href=";ch=Inf&amp;chlast=Inf&amp;pub=AlH&amp;publast=AlH&amp;type=org&amp;typelast=org" target="_blank">&nbsp;part 1</a> of this article series, we created our database and used it to display the values of each variable on the GUI. We only covered how to add basic data types as well as enums and other objects. This time, we will do some modifications to the original database, and work on including data structures. Because of the nature and size of data structures, we will not be displaying the values on the screen as last time. Instead, we will serialize them into a text file with our custom format, demonstrating a second useful case where we can use this library.</p> <p>Before we begin, I suggest you download this file (<a href="" target="_blank">Object Introspection Part 2 Project Files</a>), and select the one called <strong>ObjectIntrospection_Part2_Start.yyz</strong>, which I will use as our starting point. It’s pretty much what we ended up with after following part 1&nbsp;of the article, but with a couple of name changes, and some tweaks that had to be made to allow for data structures to be added. I also included three objects with several cases to stress test our program at the end.</p> <p>When you run the game, this is what you’ll get:</p> <p><img alt="Object-introspection-image1-0718.png" src="" style="display:block; margin-left:auto; margin-right:auto" /></p> <p>Let's get started.</p> <h2>Changes from the previous version</h2> <p>As mentioned above, I changed a few things to make the code more readable and make some new things possible. These changes are:</p> <ul> <li>Enumerators now have a lowercase E at the beginning of their name, to make them easier to identify.</li> <li> <p>We added a new enum in our <strong>oOI_Manager</strong> object called <strong>eOI_VarInfo</strong>. It is used to address the 2D array in our definitions more clearly, by specifying which part of the data to grab, between the name, type (or types array), and extra data we may need.</p> </li> <li> <p>The type section in our definition can now be an array instead of just an enum value. We will cover later why this change is important.</p> </li> <li> <p>The objects we are using have different values in them as I changed my tests. Also note that all types are passed in as arrays even if it’s just one element. This will make sense later. Know that some lines are commented out in <strong>oPlayer</strong> and <strong>oAlly</strong>, but we will uncomment them when we implement the corresponding functions for testing.</p> </li> </ul> <p>Everything else should be the same. I removed all our <strong>Inspect</strong> functions since we won’t use them this time around.</p> <h2>Serialization format</h2> <p>The format we will use is not a standard one like JSON or XML (but you can definitely implement it to mimic those if you want). The general structure follows this form: the variable name, followed by a colon, then the type of the variable, and last we have an equal sign followed by the value of the variable. With data structures, the equal sign is followed by an opening bracket and then a list of the values using the same format. Here are&nbsp;two examples:</p> <pre> <code>Variable Name : Type (Basic) = Value</code></pre> <pre> <code>Variable Name : Type (Data Structure) = { Index0 : Type = Value Index1 : Type = Value Index2 : Type = Value }</code></pre> <p>Now we know what our end goal is, let’s add some things to the manager to make our life easier later on.</p> <h2>oOI_Manager additional variables</h2> <p>To serialize data structures and objects, we need to go deeper each time. Keeping track of variables when you are inside a recursive call to a function can be tricky. Luckily, we have a global manager that can store that information for us every step of the way. It also makes our function calls a lot cleaner since we don’t have to keep passing the same values around all the time (such as the filename or object ids). At the bottom of your <strong>oOI_Manager’s</strong> create event, these should be your variables:</p> <pre> <code>// oOI_Manager’s Create Event _currObject = noone; // Keeps track of the object we are working on _currInstance = noone; // Keeps track of the object instance we are working on _currIndex = 0; // Keeps track of the variable index for the current object _currDepth = 0; // Keeps track of the current variable depth when using recursion _currExtra = 0; // Stores the extra data information _currTypes = 0; // Stores the types array _currValue = 0; // Stores the value of the current variable _indentLvl = 0; // Indenting level used for serialization _openFile = 0; // Reference to the open file</code></pre> <p>Before we write our actual serialize functions, we will write three utility scripts to help with the formatting of the file.</p> <h2>Utility serialization scripts</h2> <p>The first of these scripts is called <strong>OI_Indent</strong> and, as the name implies, it will help us indent to the correct column depending on how deep we are in a data structure or object. The script looks like this:</p> <pre> <code>// OI_Indent Script // Get the manager var manager = global.OI_Manager; repeat(manager._indentLvl) file_text_write_string(manager._openFile, &quot;\t&quot;);</code></pre> <p>We grab a handle to the manager and then add white space in the form of a <em>tab</em> for every indent level we are in. Notice we are using <em>repeat</em> for our loop. The reason is that we don’t need the index for this operation, so it’s slightly faster to use repeat than a <em>for</em> or <em>while </em>loops.</p> <p>Next we are creating a script called <strong>OI_OpenBlock</strong> to specify how we open objects and data structures (in our case, we use an opening bracket (<strong>{</strong>) on a new line. This is the script:</p> <pre> <code>// OI_OpenBlock Script // Get the manager handle var manager = global.OI_Manager; // Open Block OI_Indent(); file_text_write_string(manager._openFile, &quot;{\n&quot;); ++manager._indentLvl;</code></pre> <p>After we grab the handle to the manager, we indent using the script we wrote, then we place an opening bracket, and go to a new line. We also increase the indent level.</p> <p>Analog to the previous script, we will now create one last script called <strong>OI_CloseBlock</strong>, to specify how we want to finish a block for an object or data structure, like this:</p> <pre> <code>// Close Block Script // Get the manager handle var manager = global.OI_Manager; // Open Block --manager._indentLvl; OI_Indent(); file_text_write_string(manager._openFile, &quot;}\n&quot;);</code></pre> <p>Same idea as before, but we do the process backwards, decreasing the indent level first, then calling our OI_Indent script, and placing our closing bracket with a new line.</p> <p>Now we set up these scripts, we are ready to serialize our object.</p> <h2>Kickstart the recursive serialize function</h2> <p>Last time we had one Inspect function that would do all the legwork. This time though, we will have a special function that will set all the initial values and start the (possibly) recursive call. I called this script <strong>OI_Serialize</strong>, which looks like this:</p> <pre> <code>// OI_Serialize Script // Get the parameters var fileName = argument0; var instance = argument1; // Get a handle to the manager var manager = global.OI_Manager; // File handling var file = file_text_open_write(fileName); // Initialize variables manager._currValue = instance; manager._currObject = instance.object_index; manager._openFile = file; manager._currIndex = 0; manager._currDepth = 0; manager._currTypes = 0; manager._currExtra = 0; // Start the recursive serialization OI_SerializeObject(); // Reset variables manager._currObject = noone; manager._openFile = 0; manager._currIndex = 0; manager._currDepth = 0; manager._currTypes = 0; manager._currExtra = 0; manager._currValue = 0; // Add extra line and close the file file_text_writeln(file); file_text_close(file);</code></pre> <p>We are taking two parameters from the user. The first is the name of the file to write into, and the second is the <strong>id</strong> of the instance we want to serialize. Next, we open the file to write into it (note that when you open as <em>write</em> it will overwrite another file with the same name in that directory, so if you want to keep adding to the same file, open as <em>append</em>, but this works for the goals of this article). Later we set the initial values to all the variables we created in the manager object. We then call our script to serialize the object which is the one that will do most of the work. Last, we reset our variable values, and close the file.</p> <p>Now let’s implement that Serialize Object script and some basic types.</p> <h2>Serialize the initial object and the basic types</h2> <p>This script will be similar to our <strong>OI_Inspect</strong> one from the previous part. It’s by far the longest one, so instead of posting the entire script and explaining it like before, I will post it in chunks, but realize the code is in the same file when you implement it yourself.</p> <pre> <code>// OI_SerializeObject Script - 1/3 // Get a handle to the manager var manager = global.OI_Manager; // Grab the object, instance, and definition var instance = manager._currValue; var object = instance.object_index; var definition = manager._objDefinitions[? object]; var file = manager._openFile; // Error handling if (!is_array(definition)) { show_debug_message(&quot;Warning: The object hasn't been defined yet.&quot;); return; } // Save these variables to use later var prevExtra = manager._currExtra; var prevTypes = manager._currTypes; var prevDepth = manager._currDepth; // Reset depth manager._currDepth = 0; // Print object name, instance ID, and open the block of variables file_text_write_string(file, object_get_name(object) + &quot; = &quot; + string(instance) + &quot;\n&quot;); OI_OpenBlock();</code></pre> <p>Just like in our other scripts, we start by grabbing a handle to the manager. We then grab a few variables we will use throughout (instance, object, definition, and file handle). After we do some error handling, we save the current extra data, types array, and depth. This is so we can restore the values if they are changed when going into the recursive calls. After, we set the current depth to zero. Realize that the depth value is unique per object, even if it’s an object within an object which is why we saved the previous one above (in case this is a nested case). Finally, we write into our file the name of our object and the instance id, followed by a call to <strong>OI_OpenBlock</strong> to have some nice formatting.</p> <p>In the next section, we iterate through every variable in the object and serialize each one in this way:</p> <pre> <code>// OI_SerializeObject Script 2/3 // Print each variable and value for (var i = 0; i &lt; array_height_2d(definition); ++i) { // Variable name OI_Indent(); var varName = definition[i, eOI_VarInfo.Name]; file_text_write_string(file, varName + &quot; : &quot;); // Get the value, or give a warning if the variable doesn't exist in the object if (variable_instance_exists(instance, varName)) manager._currValue = variable_instance_get(instance, varName); else { show_debug_message(&quot;Warning: The variable \&quot;&quot; + varName + &quot;\&quot; does not exist in the &quot; + object_get_name(object) + &quot; object.&quot;); return; } // Get the current types and extra manager._currExtra = definition[i, eOI_VarInfo.Extra]; manager._currTypes = definition[i, eOI_VarInfo.Type]; // Pick the correct serialize script depending on the variable type OI_SerializePicker(_currTypes[0]); } </code></pre> <p>We loop into our definition array, indenting first before writing our variable name. We check that the variable is valid (it exists in our object) before proceeding to avoid any issues. We then save in the manager object the types and extra arrays for this variable. Finally, we have a helper script (which I’ll show below) that picks the correct type serialization function depending on the type. Since we explained that objects are always at their own depth zero, we call it for the first element in the types array. The <strong>OI_SerializePicker</strong> script looks like this:</p> <pre> <code>// OI_SerializePicker Script // Get the parameter var type= argument0; switch(type) { case eOI_VarTypes.Int: OI_SerializeInt(); break; case eOI_VarTypes.Float: OI_SerializeFloat(); break; case eOI_VarTypes.Bool: OI_SerializeBool(); break; case eOI_VarTypes.String: OI_SerializeString(); break; case eOI_VarTypes.Enum: OI_SerializeEnum(); break; case eOI_VarTypes.Object: OI_SerializeObject(); break; }</code></pre> <p>This is simply a switch statement that calls the appropriate script depending on the type passed in. When you add your custom data structures or variable types, this is a script you need to come into and add the new type, and adding it to the <strong>eOI_VarTypes</strong> enumerator.</p> <p>Back in the <strong>OI_SerializeObject</strong> script, we close it off with a few lines:</p> <pre> <code>// OI_SerializeObject Script - 3/3 // Close current block OI_CloseBlock(); // Return variables to their initial state manager._currExtra = prevExtra; manager._currTypes = prevTypes; manager._currDepth = prevDepth;</code></pre> <p>We close the block by placing an ending bracket, and we restore the previous values for the extra and type arrays, alongside with the depth. That’s it for this script! We will now quickly show the scripts for all the basic types before jumping into the ones for data structures.</p> <p><strong>OI_SerializeInt</strong></p> <pre> <code>// Get the manager var manager = global.OI_Manager; file_text_write_string(manager._openFile, &quot;int = &quot; + string(floor(manager._currValue)) + &quot;\n&quot;);</code></pre> <p><strong>OI_SerializeFloat</strong></p> <pre> <code>// Get the manager var manager = global.OI_Manager; file_text_write_string(manager._openFile, &quot;float = &quot; + string_format(manager._currValue, 1, 5) + &quot;\n&quot;);</code></pre> <p><strong>OI_SerializeBool</strong></p> <pre> <code>// Get the manager var manager = global.OI_Manager; file_text_write_string(manager._openFile, &quot;bool = &quot; + (manager._currValue ? &quot;True&quot; : &quot;False&quot;) + &quot;\n&quot;);</code></pre> <p><strong>OI_SerializeString</strong></p> <pre> <code>// Get the manager var manager = global.OI_Manager; file_text_write_string(manager._openFile, &quot;string = \&quot;&quot; + manager._currValue + &quot;\&quot;\n&quot;);</code></pre> <p><strong>OI_SerializeEnum</strong></p> <pre> <code>// Get the manager var manager = global.OI_Manager; file_text_write_string(manager._openFile, &quot;enum = &quot; + manager._currExtra[@ manager._currValue] + &quot;\n&quot;);</code></pre> <p>At this point, we should test our progress. In the <strong>oPlayer</strong> object’s step event, add this little piece of code:</p> <p>Then run the game and press the spacebar to create the output. The location GameMaker uses to output files by default is:</p> <p><em>C:\Users\YOUR_USERNAME\AppData\Local\PROJECT_NAME</em></p> <p>Your output should look like this:</p> <div> <img alt="object-introspection-image2-0718.png" src="" style="display:block; margin-left:auto; margin-right:auto" /> </div> <p>We are now ready to try our hand at data structures.</p> <h2>Data structure serialization</h2> <p>The idea to serialize data structures is the same, but one level deeper into our types array. We will loop through every element and call the <strong>OI_SerializePicker</strong> script for every one.</p> <p><strong>Note</strong>: due to the way our database is structured, the objects inside the data structures have to be of the same type. Yes, GameMaker allows for data structure elements to be of any type, but since we need to know the type of the element to call the function, it is a limitation.</p> <p>We will start with the most commonly used data structure: arrays.</p> <p>First, remember to add an array entry into the <strong>eOI_VarTypes</strong> enumerator inside the <strong>oOI_Manager</strong> object. Also, add an extra line in our <strong>OI_SerializePicker</strong> script that will call <strong>OI_SerializeArray</strong> when the type is array.</p> <p>Inside that script, we will write:</p> <pre> <code> // OI_Serialize Array Script // Get a handle to the manager var manager = global.OI_Manager; // Get the definition var definition = manager._objDefinitions[? manager._currObject]; // Open list block file_text_write_string(manager._openFile, &quot;array =\n&quot;); OI_OpenBlock(); ++manager._currDepth; var array = manager._currValue; for (var i = 0; i &lt; array_length_2d(array, 0); ++i) { OI_Indent(); file_text_write_string(manager._openFile, &quot;a&quot; + string(i) + &quot; : &quot;); manager._currValue = array[@ i]; OI_SerializePicker(manager._currTypes[@ manager._currDepth]); } --manager._currDepth; OI_CloseBlock();</code></pre> <p>As always, we get a handle to the manager to simplify our variable names. We get our definition, write the name of the type (in this case array) and open the block. The depth is now increased by one, which will get us the type of each element in our data structure. The current value is set to the array so that we don’t have to pass it to every script in the script. Next, we iterate through every element in the array by using the <strong>array_lenght_2d </strong>function. This is a little trick that works because every array in GameMaker is treated as a two-dimensional array internally, so this will work for 1D and 2D arrays.</p> <p>For each element, we indent it and since each element in an array is not named, we identify them by writing a lowercase <strong>a</strong> and the index number next to it. We then get the value of the element at that index and we call our <strong>OI_SerializePicker</strong> function, passing as our type the index in our types array corresponding to the recursion depth we are at. After all the elements are processed recursively, we reduce our depth by one and close the block.</p> <p>We can now uncomment the line in our <strong>oPlayer</strong> object that has the array so we can test it. The array part should now be displayed like this:</p> <p><img alt="object-introspection-image3-0718.png" src="" style="display:block; margin-left:auto; margin-right:auto" /></p> <p>Also, with what we have, we can also uncomment the line that holds the 2D array in our player object (the one with the variable named <strong>_minimap</strong>) and it should work as expected, since the recursion is working already. That one is longer so I won’t show an image here, but check your file and it should be there now.</p> <p>The last thing we will do in this article is repeat the process for the <strong>ds_list</strong> and the <strong>ds_map</strong>, and you see that the scripts are similar.</p> <p>As before, remember to add lists and maps to your enumerator and to the <strong>OI_SerializePicker</strong> script. Then, create two scripts called<strong> OI_SerializeList</strong> and <strong>OI_SerializeMap</strong> respectively. The one for lists looks like this:</p> <pre> <code>// OI_SerializeList Script // Get a handle to the manager var manager = global.OI_Manager; // Get the definition var definition = manager._objDefinitions[? manager._currObject]; // Open list block file_text_write_string(manager._openFile, &quot;list =\n&quot;); OI_OpenBlock(); ++manager._currDepth; var list = manager._currValue; for (var i = 0; i &lt; ds_list_size(list); ++i) { OI_Indent(); file_text_write_string(manager._openFile, &quot;l&quot; + string(i) + &quot; : &quot;); manager._currValue = list[| i]; OI_SerializePicker(manager._currTypes[@ manager._currDepth]); } --manager._currDepth; OI_CloseBlock();</code></pre> <p>Pretty much the same as the array one. The only differences are the name of the type we write, how we get the size of the data structure, the use of a lowercase <strong>l</strong>&nbsp;for our indexes, and the use of the proper accessor for lists.</p> <p>Moving on to the script for the map, we have:</p> <pre> <code>// OI_SerializeMap Script // Get a handle to the manager var manager = global.OI_Manager; // Get the definition var definition = manager._objDefinitions[? manager._currObject]; // Open list block file_text_write_string(manager._openFile, &quot;map =\n&quot;); OI_OpenBlock(); ++manager._currDepth; var map = manager._currValue; var currKey = ds_map_find_first(map); repeat(ds_map_size(map)) { OI_Indent(); file_text_write_string(manager._openFile, currKey + &quot; : &quot;); manager._currValue = map[? currKey]; OI_SerializePicker(manager._currTypes[manager._currDepth]); currKey = ds_map_find_next(map, currKey); } --manager._currDepth; OI_CloseBlock();</code></pre> <p>Same as the list, but the one thing that may trip you up is how we traverse the map. Because maps are not sequential and we don’t control the order of the elements, GameMaker kindly provided us with some functions (<strong>ds_map_find_first</strong> and <strong>ds_map_find_next</strong>) to allow us to travel through every element as if they were in a sequence. We also take advantage of the fact that maps have keys for each element, so we use that key as our name for each element.</p> <p>We are now free to uncomment all the lines in the definitions of our three objects (<strong>oPlayer</strong>, <strong>oAlly</strong>, and <strong>oEnemy</strong>). Once we do that, we can run the project again, press space, and see if everything is working correctly. You can also download the&nbsp;<a href="" target="_blank">final version of the project</a> if you get stuck somewhere along the way.</p> <p><strong>Note</strong>: I created a good variety of tests to show how you can nest data structures together in as many ways as possible. Theoretically it will work with any combination and however deep you’d like to go, but if there are any issues, please let me know.</p> <h2>Next steps and additions&nbsp;</h2> <p>If you liked the result we got so far and want to take it further, here are some ideas of things you can add to solidify the knowledge and improve your library:</p> <ul> <li> <p><strong>Add the ds_grid</strong>: You may have noticed that we didn’t implement a way to serialize a ds_grid. If you are using those in your project, feel free to add it. The function will be like that of the array.</p> </li> <li> <p><strong>Custom data structures</strong>: If you implemented your own data structure into the game (like a binary tree or a slotmap), it would be a nice challenge to implement a serialization function for those.</p> </li> <li> <p><strong>GameMaker assets</strong>: in the <strong>oEnemy</strong> object, we serialized some of the built-in variables of the object (X and Y positions). Since we know it’s possible, it would be a good idea to add other ones, such as the sprite used by the object. If you are not entirely sure how, read the documentation on these functions: <strong>sprite_get_name</strong>, <strong>asset_get_index</strong>, and <strong>asset_get_type</strong>. It can even work for music, sound effects, tilesets, anything really.</p> </li> <li> <p><strong>Write a deserializer</strong>: We can now save files, but we still can’t read them in. Creating a deserializer shouldn’t be too hard to implement (just do the same we did, but backwards) for every variable type.</p> </li> <li> <p><strong>Use the database for other purposes</strong>: A&nbsp;great way to use this database is to create a nice editor where you can click an object in the scene and it creates a window with all the variables, showing you the values and hopefully letting you edit them. I recommend using the<a href="" target="_blank"> ImGUIGML extension</a> to do this easier, but it can also be done with a custom UI.</p> </li> <li> <p><strong>Change the serializer so it uses JSON format</strong>: If you prefer to use a well-known serializing format like JSON or XML, feel free to modify it to resemble those using the same strategies.</p> </li> </ul> <h2>Project Download</h2> <p><a href="" target="_blank">Object introspection part 2 project files</a></p> <p>Inside you will find two&nbsp;.yyz files, one you should use if you want to follow along with the article (called <strong>ObjectIntrospection_Part2_Start.yyz</strong>), and another one with the final version of the project, if you want to see the source code or get stuck while following along (called <strong>ObjectIntrospection_Part2_Final.yyz</strong>).</p> <h2>Extra Links</h2> <ul> <li><a href="" target="_blank">ImGUIGML extension</a></li> <li><a href="" target="_blank">Object Type Introspection in GameMaker - Part 2</a></li> </ul> <h2>Conclusion</h2> <p>This can be an advanced topic, but a super powerful one that can help you solve complicated problems and automate them to save time. If you have any suggestions or questions, you can contact me on Twitter (<a href="" target="_blank">@AleHitti</a>). Thank you for reading. Until next time!</p> <div> <img alt="AlejandroBio.jpg" src="" style="display:block; height:145px; margin-left:auto; margin-right:auto; width:583px" /> </div> <div> <em>Alejandro Hitti is a videogame Programmer and Designer from Venezuela. Although his background is in C++ and working using custom-made game engines, his two commercial games, INK and HackyZack, were made using GameMaker Studio 1.4. With the release of GameMaker Studio 2, that became his engine of choice. The novelty of GMS2, paired with his knowledge of the previous version, ignited his interest to create tutorials that focus on this new engine.</em> </div> /blogs/alexa/post/eec5b359-bfb9-4401-97d4-72bdce6085cc/5-new-tutorials-to-help-you-integrate-alexa-voice-capabilities-into-your-product 5 New Tutorials to Help You Integrate Alexa Voice Capabilities into Your Product Ted Karczewski 2018-07-18T15:27:12+00:00 2018-07-18T15:27:12+00:00 <p><img alt="" src="" /></p> <p>We’ve launched new introductory-to-advanced hands-on tutorials that help you get started with our software and hardware development tools. There are five tutorials to get you started, and we'll be adding new content throughout the year.</p> <p style="text-align:justify"><img alt="" src="" /></p> <p style="text-align:justify">Alexa has helped usher in a new era of technology – a world where talking to devices will be as common as using touch. We want to make it easier for you to learn how to design, build, and launch your own voice-forward products using the Alexa Voice Service (AVS). We’re excited to share a collection of tutorials that guide you through building your own Alexa-enabled products.</p> <h2 style="text-align:justify">What’s New for Developers?</h2> <p style="text-align:justify">We’ve launched new introductory-to-advanced hands-on tutorials that help you get started with our software and hardware development tools. You bring your Raspberry Pi, and we’ll bring the how-to guides, instructional diagrams, and code snippets. We published five tutorials to get you started, and we’ll be adding new content throughout the year. Start learning about the topics below today:</p> <ul> <li style="text-align:justify">Create your first Device Profile to get started with AVS</li> <li style="text-align:justify">Build a quick Alexa-enabled prototype on a Raspberry Pi using our AVS Device SDK</li> <li style="text-align:justify">Add sounds to your Alexa-enabled prototype to communicate device state</li> <li style="text-align:justify">Modify your Alexa-enabled prototype’s focus manager to customize the Alexa experience</li> <li style="text-align:justify">Implement LEDs to visually indicate device state on your Alexa-enabled prototype</li> </ul> <h3 style="text-align:justify"><br /> <strong><a href="" target="_blank">Get started with Tutorials &raquo;</a></strong></h3> <h2 style="text-align:justify"><img alt="" src="" style="height:297px; width:700px" /><br /> Share Your Alexa-Enabled Prototype</h2> <p style="text-align:justify">While Amazon continues to handle the complex natural language understanding and automatic speech recognition in the cloud, the developer community has played an important role in making Alexa the rich, delightful service it is today. Without your big ideas, fewer customers would have experienced the power of Alexa, and we hope these tutorials enable even more prototypes, products, and experiences.</p> <p style="text-align:justify">Try our tutorials and share what you build by sending me an overview video, a <a href="" target="_blank"></a> project page, GitHub page, or some other form of content. Submit your projects and contact information using the “Feedback” button on each tutorial for a chance to be featured on the <a href="" target="_blank">Alexa Blog</a>. Think outside the box – what new product category or facet of our lives could benefit from a voice-forward, intelligent UI?</p> <h2 style="text-align:justify">Don’t Miss Another Update</h2> <p style="text-align:justify"><a href="" target="_blank">Sign up for Voice Mail</a>, our monthly newsletter, to get all of this content delivered to your inbox directly.</p> <h2 style="text-align:justify">What Is AVS?</h2> <p style="text-align:justify">AVS makes it easy to integrate Alexa directly into your products and bring voice-forward experiences to customers. Through AVS, you can add a new natural user interface to your products and offer your customers access to a growing number of Alexa features, smart home integrations, and skills. <a href="" target="_blank">Get Started</a>.</p> /blogs/alexa/post/5ed87ab4-16ee-4e7d-8f6e-6c45a844b75d/best-practices-for-building-alexa-skills-for-fire-tv-cube Best Practices for Building Alexa Skills for Fire TV Cube Jennifer King 2018-07-18T14:00:00+00:00 2018-07-18T14:38:45+00:00 <p><img alt="" src="" style="height:480px; width:1908px" /></p> <p>Here I’ll walk you through some tips for building an Alexa skill for Fire TV Cube, using core best practices for creating voice-first experiences for devices with screens.</p> <p><img alt="" src="" style="height:480px; width:1908px" /></p> <p>There are tens of millions of Alexa-enabled devices out there today that allow you to communicate with Alexa across multiple mediums. Amazon just recently <a href="">launched the new Fire TV Cube</a>, which is the first hands-free 4K Ultra HD streaming media player with Alexa—delivering an all-in-one entertainment experience. Now, Alexa skill developers can create a voice-first experience with a large screen in mind.</p> <p>Here I’ll walk you through some tips for building an Alexa skill for Fire TV Cube, using core best practices for creating voice-first experiences for devices with screens.</p> <h2>First, Understand Customer Interactions with Fire TV Cube</h2> <p>Fire TV Cube can enable all published Alexa skills. This means that customers can use the skills you built for any Echo device, including Echo Show and Echo Spot, on Fire TV Cube.</p> <p>For the most part, you can assume that a customer using Fire TV Cube will interact with your custom skill as they would with any other Echo device with a screen. They will primarily use it for voice interactions, reference the Alexa app to see display cards, and then look toward the screen to view the display templates.</p> <p>As with any device, consider where and how a customer might be using your skill when crafting visual responses. With Echo Spot, for example, we previously advised to make the primary content of each template visible and recognizable from up to five feet away. For the Echo Show display, we advised a template that is visible from seven feet away. With Fire TV Cube, we suggest designing for something 10 feet away or more.</p> <p>So, how should you optimize your skill design across devices? The best approach is to keep it simple. Regardless of the visual response, the display should always be second to what Alexa is saying. Rely on your voice experience, and use the screens to complement that experience.</p> <h2>Set Up Your VUI to Support Your Fire TV Cube GUI</h2> <p>As with any multimodal skill, you can choose what interfaces—voice user interfaces (VUI) or graphical user interfaces (GUI)—you can support. Regardless of the interface, you want to assure you are delivering an experience that can be handled on any device.</p> <p>Developing an Alexa skill with a TV could easily be interpreted as creating a skill that more heavily relies on visuals, thus making them necessary for a standout skill. This is not the case for voice-first experiences: If you do not incorporate screens into your custom skill, Fire TV Cube will display the cards you provide for the Alexa app.</p> <p>To add displays as a supported interface into your Alexa skill, you need to edit your skill’s manifest. There are two easy ways to do this—programmatically or through the Alexa Developer Console.</p> <p>In your skill.json, under apis.custom.interfaces, add a type RENDER_TEMPLATE. This is essentially saying that you want your skill to support rendering templates, so a response including a render template directive should be interpreted as valid.</p> <pre> <code class="language-javascript">&quot;apis&quot;: { &quot;custom&quot;: { &quot;endpoint&quot;: { &quot;sourceDir&quot;: &quot;lambda/custom&quot; }, &quot;interfaces&quot;: [ { &quot;type&quot;: &quot;RENDER_TEMPLATE&quot; } ] } },</code></pre> <p>Once you have added the interface, you need to add the required display intents to your interaction model.</p> <pre> <code class="language-javascript">{ &quot;interactionModel&quot;: { &quot;languageModel&quot;: { &quot;invocationName&quot;: &quot;my custom skill&quot;, &quot;intents&quot;: [ { &quot;name&quot;: &quot;AMAZON.MoreIntent&quot;, &quot;samples&quot;: [] }, { &quot;name&quot;: &quot;AMAZON.NavigateHomeIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.NavigateSettingsIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.NextIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.PageUpIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.PageDownIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.PreviousIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.ScrollRightIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.ScrollDownIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.ScrollLeftIntent&quot;, &quot;samples&quot;: [] },{ &quot;name&quot;: &quot;AMAZON.ScrollUpIntent&quot;, &quot;samples&quot;: [] }, ...</code></pre> <p>Another way to do this is through the <a href="">developer console</a>. Navigate to your skill and scroll to interfaces. Once there, toggle “Display Interface,” save and build your skill. This will enable rendering templates in your skill and automatically add all of the required intents to your interaction model.</p> <p><img alt="" src="" style="display:block; margin-left:auto; margin-right:auto" /></p> <h2>Check for Display Support</h2> <p>Now that you have enabled templates to be enabled within your skill, you need to assure you are incorporating them into your response at the appropriate time. Before adding the template to your response, you need to assure that the current device supports the display interface. To do so, you can use the supportsDisplay()function in the <a href="" target="_blank">Alexa Skill-Building Cookbook</a>. Then, within your skill code you can use the function to determine if you should include the template in your responseBuilder.</p> <pre> <code class="language-javascript">if (, handlerInput)) { // insert render template code here }</code></pre> <p>We include this condition because your code needs to respond to both cases where the screen is or is not supported.</p> <h2>Add Render Templates</h2> <p>There are two categories of display templates that you can use within your custom skill: Body Templates and List Templates. A great example of how both template types are handled can be seen in the <a href="">demo display directive</a>. Note that the skill builds with an Echo Show in mind, but the use of <a href="">Body Templates</a> and <a href="">List Templates</a> renders similarly across devices.</p> <p>Remember that each template is displayed alongside a speech response. Currently, you cannot render a template without a user prompting a response. It is bad practice to render a template without Alexa saying something to go with it. Along with that, you can only render one template per response. The templates should help direct the conversation.</p> <p>At its core, a display template is just a JSON file. Each template has fields you can specify, such as title, backgroundImage, backButton, etc. Regardless of which template you are using, at minimum, to create the display you need to follow three steps:</p> <ol> <li>Assure the display is supported by calling supportsDisplay.</li> <li>Include a Display.RenderTemplate directive in your skill response.</li> <li>Set the type of your template to whatever you are trying to render.</li> </ol> <p>From there, you can specify various fields to build a complementary display. Here is an example of rendering ListTemplate2 in the <a href="">Alexa Skills Kit (ASK) Software Development Kit (SDK) for Node.js</a>.&nbsp;</p> <pre> <code class="language-javascript">if (, handlerInput)) { handlerInput.responseBuilder.addRenderTemplateDirective({ type: 'ListTemplate2', backButton: 'visible', backgroundImage: '', title: 'This is my title', listItems: [ { image: '', textContent: 'This is my list item 1', }, { image: '', textContent: 'This is my list item 2', }, { image: '', textContent: 'This is my list item 3', } ]}); }</code></pre> <p>Templates can become large. To reduce the size of your skill code file, consider decoupling your template code from your skill code and hosting it or organizing it into a separate file. You can use data-binding logic to incorporate speech text into your template. Doing so allows for quick editing, reusing your templates across multiple skills, and more readable code.</p> <h2>Interpret Touches and Clicks</h2> <p>Remember that Fire TV Cube is also not touch-enabled and the customer will be using a remote control. The touch components on the display templates will be translated to be selectable. Assure that you are using the templates to intuitively handle both touch and click. See the <a href="">Display Interface Reference</a> for more information.</p> <p>To accommodate clicks within your template, all you have to do is add a token attribute to whatever you want to be selectable. Following our previous example, here is each list item with a token attribute, making the image + text together selectable.</p> <pre> <code class="language-javascript"> listItems: [ { token: &quot;listItem1&quot;, image: '', textContent: 'This is my list item 1', }, { token: &quot;listItem2&quot;, image: '', textContent: 'This is my list item 2', }, { token: &quot;listItem3&quot;, image: '', textContent: 'This is my list item 3', } ]</code></pre> <p>Every touchable or clickable item should lead to a response that is already incorporated into your voice interaction. In other words, every event from one of these items should be discoverable via voice. For example, when a customer clicks on a list item, the display might show them more information about that particular entry. Another way to navigate to it could be by the customer saying, “Tell me more about list item one.”</p> <p>To handle the touch event fired from selecting one of these items, you need to incorporate the events in the canHandle of the appropriate intent. Doing so is a simple Boolean statement. Here is an example using the ASK SDK for Node.js:</p> <pre> <code class="language-javascript">canHandle(handlerInput) { const request = handlerInput.requestEnvelope.request; const hasBeenClicked = request.type === 'Display.ElementSelected' &amp;&amp; request.token === 'listItem1'; return hasBeenClicked || (request.type === 'IntentRequest' &amp;&amp; === 'MoreInfoIntent'); }</code></pre> <p>You can have multiple tokens navigate to the same intent, and adjust the response according to whatever token was selected. Logically, tokens can be used alongside slot logic. For example, if a customer says, “Tell me more about list item one,” then “list item one” could be the slot value for the MoreInfoIntent. You could use the same slot evaluation logic to evaluate what to do when the token has been clicked.</p> <h2>Video and Audio App Directives with Fire TV Cube</h2> <p>Particularly with Fire TV Cube, you will probably get instances of a customer wanting to view something with their conversation. Using a <a href="">Video</a> or <a href="">Audio</a> App directive in your skill is easy to handle and navigate to within your templates. Both of these directives can be initiated via voice or click.</p> <p>To use the directives, you will also need to incorporate the Video Player or Audio Player interfaces into your skill manifest. Indicating these interfaces is done similarly to the Render Template interface.</p> <p>Both of these directives also have required, built-in intents. These are AMAZON.PauseIntent and AMAZON.ResumeIntent.</p> <p>Beyond that, the implementation using both of these is very similar. You can reference the <a href="">Alexa Audio Player skill sample</a> to view the implementation. The sample demonstrates how to use single- or multiple-streams in your skill.</p> <h2>Next Steps and Helpful Links</h2> <p>When building a custom skill with display for Fire TV Cube, remember to build a voice-first experience with templates that create harmony with what Alexa is saying. Cater your experience to a large audience and a wide set of Alexa-enabled devices. And remember to keep it simple.</p> <p>Check out these resources to find out more information on Fire TV Cube and how to build multimodal skills:</p> <ul> <li><a href="">Creating Skills for Alexa-Enabled Devices with Screens</a></li> <li><a href="">Learn More about the Video Skill API</a></li> <li><a href="">VUI &amp; GUI Best Practices</a></li> <li><a href="">How Hulu Built Its Living Room Experience with Amazon Alexa</a></li> </ul> /blogs/alexa/post/f7aad965-76f5-435f-86de-7861ece48709/how-to-create-a-self-test-room-and-evaluate-your-alexa-voice-service-integration How to Create a Self-Test Room and Evaluate Your Alexa Voice Service Integration Ted Karczewski 2018-07-17T15:01:09+00:00 2018-07-17T15:01:09+00:00 <p><img alt="" src="" /></p> <p>Testing your Alexa-enabled product in a variety of scenarios will help ensure that you bring a delightful hands-free Alexa experience to your customers.&nbsp;In this blog post, we’ll cover the minimum requirements for a self-test room that you can construct at your workplace.</p> <p><img alt="" src="" /></p> <p>Alexa offers your customers a new way to interface with technology – a convenient UI that enables them to plan their day, control their smart home devices, and access news and information. If you’re already building a voice-forward product with the <a href="">Alexa Voice Service (AVS)</a>, you’ll want to ensure you have the right setup to effectively test your integration prior to launch. Testing your Alexa-enabled product in a variety of scenarios will help ensure that you bring a delightful hands-free Alexa experience to your customers and encourage habitual usage of Alexa capabilities.</p> <h2>Preparing for Product Testing</h2> <p>We recommend a two-phased approach to test your integration: self-tests and then product submission to Amazon. During self-tests, you will complete a series of exercises to ensure your product meets functional and user experience (UX) requirements. If you’re building a far-field device or want to enable certain domains like music, you’ll also want to execute additional testing prior to launch. Before you start, make sure your integration adheres to our <a href="">Functional Requirements</a>, review our <a href="">UX Guidelines</a>, and set up your self-test environment.</p> <p>In this blog post, we’ll cover the minimum requirements for a self-test room that you can construct at your workplace.</p> <h2>Setting Up a Self-Test Room</h2> <p>Our experience has helped us hone in on some standard characteristics that make a self-test room effective for voice performance evaluation. The room requirements are similar to those defined by the <a href="">European Telecommunications Standards Institute (ETSI)</a>, with some customization. Specifically, we are leveraging <a href="">ETSI EG 202 396-1 V1.2.2, Section 6.1</a>. Best of all, our recommendation doesn’t require you to build a specific type of room – you can enable self-testing in a typical office room. These are the minimum requirements:</p> <p><strong>Room Size</strong></p> <p>We recommend a room at least 2.5 m x 3.5 m x 2.2 m. These dimensions are in reference to usable space.</p> <p><strong>Room Treatment</strong></p> <p>Look for a room with wall-to-wall carpet and some acoustical damping (ceiling tiles) in the ceiling. If the room has a lot of windows or a large whiteboard, consider covering these with a set of curtains to avoid strong reflections by hard surfaces. We target a reverberation time that is less than 0.7 s and higher than 0.2 s. This is targeted for the frequency range captured by Alexa, between 100 Hz and 8 kHz. For technical specifics we defer to ISO 3382-3:2012. If you are building a test chamber, please consider 10 Hz neoprene isolators and bass trap panels in the corners.</p> <p><strong>Noise Floor</strong></p> <p>To reduce the influence of unwanted noise on your results, the background noise of your test room should be less than 35 dBA.</p> <p><strong>Equipment</strong></p> <p>Your setup requires 1 noise speaker, 4 speech speakers, your device under test and at least a 0.5 m clearance between the walls, test speakers, and your device. To control the output of the speech speakers and noise speaker you will want to get a multi-channel sound card, such as the Roland Octa-Capture or RME Fireface.</p> <p><img alt="" src="" style="display:block; height:434px; margin-left:auto; margin-right:auto; width:500px" /></p> <h2>Getting Started with Self-Tests and Placement</h2> <p>The above image shows the placement and angles to complete testing. After you’ve completed the self-test room set up, you can evaluate your Alexa integration, and correct bugs uncovered during the process. For access to Amazon self-tests and the audio files required for testing, reach out to your Amazon point-of-contact or follow the instructions for how to launch with AVS. Refer to our <a href="">Product Testing overview</a> for more information on self-tests and how to submit your device for additional Amazon review.</p> <h2>New to AVS?</h2> <p>AVS makes it easy to integrate Alexa directly into your products and bring voice-forward experiences to customers. Through AVS, you can add a new natural user interface to your products and offer your customers access to a growing number of Alexa features, smart home integrations, and skills. <a href="">Get Started</a>.</p> /blogs/alexa/post/1a4f4efb-21e1-445b-af3e-1b740a12e6fd/things-every-alexa-skill-should-do-handle-the-unexpected-gracefully Things Every Alexa Skill Should Do: Handle the Unexpected Gracefully Jennifer King 2018-07-17T14:00:00+00:00 2018-07-17T14:00:00+00:00 <p><img alt="" src="" /></p> <p>Learn how to handle unexpected requests from customers, or instances when a customer says something that doesn’t map to any intents in your skill.</p> <p><img alt="" src="" /></p> <p><em>Editor's Note: This is an installment of our new series called </em><a href=""><em>Things Every Alexa Skill Should Do</em></a><em>, which highlights the important features and lessons that every skill builder can use to make their skills more engaging for customers. Follow the series to learn, get inspired, and build engaging Alexa skills.</em></p> <p>When building a skill, you might find yourself making assumptions about what a customer might say. It is important to make sure that you’re anticipating something completely outside your expected set of responses, and handling it in a way that allows the customer to get back on the rails.</p> <p>In the <a href="" target="_blank">Dev Tips skill</a>, for example, we encourage developers to ask the skill about the issue or topic that they want to know more about. This also means that there will be times that a customer says something we didn’t expect.</p> <p>When testing how a skill handles unexpected utterances, we like to use the phrase “pizza pie.” We use this to see if the skill handles words the developer didn’t plan for, and see how the skill responds. In the case of Dev Tips, “pizza pie” will deliver a response similar to this one:</p> <p style="margin-left:40px"><em>“I heard you say pizza pie. I’m sorry, I don’t know how to help you with that.”</em></p> <p>The skill acknowledges that it heard the customer, and it even repeats the words captured in the slot value so that the user understands why it missed. This gives the customer an opportunity to try their question again, or ask a different one.</p> <p>By handling these errors gracefully, the customer understands that what they requested wasn’t available, but they can continue to interact with the skill.</p> <p>To learn more, check out the <a href="" target="_blank">Alexa Voice Design Guide</a>. Or enable the new <a href="">Fallback Intent</a> in the Alexa Skills Kit built-in library to respond gracefully to out-of-domain requests to your Alexa skill.</p> <h2>Get the Guide: 10 Things Every Alexa Skill Should Do</h2> <p>With more than 40,000 skills in the Alexa Skills Store, we’ve learned a lot about what makes a skill great and what you can do to create incredible voice experiences for your customers. Download the complete guide about <a href=";sc_channel=SM&amp;sc_details=Blog1" target="_blank">10 Things Every Alexa Skill Should Do</a> for more tips, code samples, and best practices to build engaging skills.</p> /blogs/alexa/post/5f9f44b4-8e1c-499a-94e5-1b113c6e42a7/mario-johansson-begeistert-mit-seinen-ambient-sound-skills-f%C3%BCr-alexa Mario Johansson begeistert mit seinen Ambient Sound Skills f&uuml;r Alexa Kristin Fritsche 2018-07-17T08:00:00+00:00 2018-07-20T15:12:36+00:00 <p><img alt="DE_Mario_Johansson.jpg" src="" /></p> <p>Mario Johansson entwickelt unter anderem Ambient Sound Skills f&uuml;r Alexa. In der Developer Story erz&auml;hlt er, wie er zur Skillentwicklung gekommen ist, teilt seine Best Practices und gibt Ratschl&auml;ge f&uuml;r neue Skill-Entwickler.</p> <h2><img alt="DE_Mario_Johansson.jpg" src="" /></h2> <h2>Mario Johansson begeistert mit seinen Ambient Sound Skills f&uuml;r Alexa</h2> <p>Neue Technologien interessieren Mario Johansson, Inhaber und Entwickler von <a href="" target="_blank">Envy Eden</a>, schon von Berufswegen. Als IT-Berater muss er sich auskennen, um seine Kunden gut beraten zu k&ouml;nnen. Alexa hat er zuerst einmal als Nutzer ausprobiert, bevor er selbst mit der Skill-Entwicklung gestartet hat. „Ich habe mich langsam herangetastet, mir das Alexa Skills Kit angeschaut, in Tutorials sowie der Dokumentation gest&ouml;bert. Es ist nicht schwer, alles ist super erkl&auml;rt“, erz&auml;hlt Mario.</p> <p>Sein erster Skill sollte aber auch einen Nutzen bringen und so kam Mario die Idee, die Gebetszeiten in seinem Skill <a href=";ie=UTF8&amp;qid=1527585746&amp;sr=1-26&amp;keywords=envy+eden" target="_blank">Muslim</a> zu hinterlegen. „Mit einem Skill, den die Nutzer t&auml;glich nutzen und der ihnen etwas Allt&auml;gliches versch&ouml;nert oder erleichtert, ist man als Entwickler gut beraten“ findet Mario. Der Erfolg gibt ihm recht, seine Nutzer sind begeistert, was auch die positiven Bewertungen im <a href="" target="_blank">Alexa Skill Store</a> belegen.</p> <p>Bald darauf startete er seine erfolgreichen Ambient Sound Skills, mit denen seine Nutzer zu ihrer Stimmung passende Ger&auml;usche h&ouml;ren k&ouml;nnen. Der Skill mit Sounds f&uuml;r einen <a href=";ref-suffix=ss_rw&amp;ref_=cm_sw_r_tw_a2s_a2s_ZXesBbRZP1X8N785&amp;sr=1-2&amp;keywords=guten+morgen" target="_blank">Guten Morgen </a>gewann sogar die Entwickler-Aktion im Februar und hatte bereits in den ersten 30 Tagen die meisten Nutzer unter allen Teilnehmern.</p> <h2>Das Voice User Interface (VUI) entwickeln</h2> <p>Ein guter Use Case allein reicht aber nicht, wei&szlig; Mario: „Man muss sich genau &uuml;berlegen, wie die Nutzer den Skill verwenden wollen. Ich mache mir vor der eigentlichen Entwicklung eine Skizze mit den verschiedenen Wegen und Optionen im Skill und daraus entsteht dann mein VUI.“ Trotzdem kann man nicht jede Art der Skill Nutzung voraussehen.</p> <p>„Ich arbeite eigentlich oft an meinen Skills, auch wenn ich nur neben der Arbeit daf&uuml;r Zeit habe. Ich schaue mir regelm&auml;&szlig;ig die Bewertungen und das Feedback der Nutzer an und verbessere die Skills“, berichtet Mario und erz&auml;hlt weiter: „Ganz cool finde ich die neue <a href="">Intent Request History API</a> im Alexa Skills Kit, mit der man mehr Infos zur Nutzung eines Skills erh&auml;lt.“ Die neue API erlaubt Entwicklern den Einblick in h&auml;ufig verwendete Formulierungen und zeigt oft auftretende Interaktionen der Nutzer mit einem Skill. Die Daten werden dabei anonymisiert zur Verf&uuml;gung gestellt.</p> <h2>Der Entwicklungsprozess</h2> <p>Mario programmiert mittlerweile in Python lokal auf dem Rechner und l&auml;dt den Code dann mit <a href="">ASK Command Line Interface</a> hoch. Als Backend benutzt er <a href="" target="_blank">AWS Lambda</a>.</p> <p>„Ich habe w&auml;hrend der Entwicklung immer dazu gelernt. Zum Beispiel waren meine Streams f&uuml;r die Ambient Sound Skills am Anfang zu lang. Dadurch gab es keine weitere Interaktionsm&ouml;glichkeit mit dem Nutzer, was ich mittlerweile ge&auml;ndert habe. Bei meinem Skill <a href=";ref-suffix=ss_rw&amp;ref_=cm_sw_r_tw_a2s_a2s_JZesBbPGDXGDH" target="_blank">Quiz Million&auml;r</a> habe ich sp&auml;ter das Session Management eingebaut, damit der Nutzer immer bei seinem letzten Spielstand weiterspielen kann“, erz&auml;hlt Mario.</p> <h2>Wie generiert man neue Nutzer?</h2> <p>Eine wichtige Frage, die viele Skill Entwickler besch&auml;ftigt: Wie macht man seinen Skill bekannt? Mario hat mit Keywords gearbeitet, um die Sichtbarkeit zu erh&ouml;hen. „Organische Suche klappt immer noch am besten. Dazu sollte man sich den Namen des Skills und die Skill Beschreibung genau &uuml;berlegen und sinnvolle Keywords einf&uuml;gen. So wird der Skill von Suchmaschinen besser gefunden. Ich mache vor der Entwicklung immer eine Keyword-Suche und schaue mir an, was gut funktioniert. Das Skill Icon sollte auch ansprechend sein. Ich habe auch Facebook Ads ausprobiert, was eine zus&auml;tzliche Option sein kann.“</p> <h2>Tipps von Entwickler zu Entwickler</h2> <p>„Wenn man anf&auml;ngt, ist es gut, sich ein Grundverst&auml;ndnis &uuml;ber das Thema zu verschaffen. Was ist eine Lambda Funktion, wie baue ich einen ersten Skill etc. Der <a href="">Alexa Blog</a> ist eine sinnvolle Quelle, ich schaue eigentlich t&auml;glich vorbei. Die <a href="">kostenlosen Events</a> sind auch zu empfehlen, da trifft man auch andere Entwickler und kann sich austauschen“, r&auml;t Mario.</p> <p>Mario hat einige Pl&auml;ne f&uuml;r seine Skills. Neben der Optimierung f&uuml;r den Bildschirm von Echo Show und Echo Spot steht auch ein <a href="">Skill f&uuml;r Kinder</a> auf dem Plan.</p> <h2>Ressourcen</h2> <ul> <li><a href=";sc_category=Owned&amp;sc_channel=WB&amp;sc_campaign=BlogDevStory&amp;sc_publisher=BL&amp;sc_content=Content&amp;sc_funnel=Visit&amp;sc_country=DE&amp;sc_medium=Owned_WB_BlogDevStory_BL_Content_Visit_DE_Devs&amp;sc_segment=DEDevs" target="_blank">Sprachdesign Guide</a></li> <li><a href=";sc_category=Owned&amp;sc_channel=WB&amp;sc_campaign=BlogDevStory&amp;sc_publisher=BL&amp;sc_content=Content&amp;sc_funnel=Visit&amp;sc_country=DE&amp;sc_medium=Owned_WB_BlogDevStory_BL_Content_Visit_DE_DEDevs&amp;sc_segment=DEDevs">Alexa Events</a></li> <li><a href=";sc_category=Owned&amp;sc_channel=WB&amp;sc_campaign=BlogDevStory&amp;sc_publisher=BL&amp;sc_content=Content&amp;sc_funnel=Start&amp;sc_country=DE&amp;sc_medium=Owned_WB_BlogDevStory_BL_Content_Start_DE_DEDevs&amp;sc_segment=DEDevs">Video-Tutorial: Entwickle deinen ersten Skill</a></li> </ul> <h2>Skill entwickeln, Entwickler-Goodie erhalten</h2> <p>Verwirkliche deine Alexa Skill Idee und mach mit bei unserer <a href=";sc_category=Owned&amp;sc_channel=WB&amp;sc_campaign=BlogDevStory&amp;sc_publisher=BL&amp;sc_content=Content&amp;sc_funnel=Visit&amp;sc_country=DE&amp;sc_medium=Owned_WB_BlogDevStory_BL_Content_Visit_DE_Devs&amp;sc_segment=DEDevs" target="_blank">Entwickler-Aktion</a>. Alle Entwickler in Deutschland, &Ouml;sterreich und Luxemburg, die zwischen dem 1. und dem 31. Juli 2018 einen deutschsprachigen Alexa Skill entwickeln, im Skill Store ver&ouml;ffentlichen und die <a href="" target="_blank">Teilnahmebedingungen</a> erf&uuml;llen, erhalten ein Alexa Entwickler Shirt. Erreicht dein Skill in den ersten 30 Tagen nach der Ver&ouml;ffentlichung mehr als 100 Nutzer (Unique User), qualifiziert er sich au&szlig;erdem f&uuml;r ein 2-er Pack Echo Buttons. Ein Entwickler eines Skills hat au&szlig;erdem die Chance, einen Echo Spot zu gewinnen. Sobald dein Skill ver&ouml;ffentlicht ist, kannst du daf&uuml;r die Werbetrommel r&uuml;hren. <a href=";sc_category=Owned&amp;sc_channel=WB&amp;sc_campaign=BlogDevStory&amp;sc_publisher=BL&amp;sc_content=Content&amp;sc_funnel=Visit&amp;sc_country=DE&amp;sc_medium=Owned_WB_BlogDevStory_BL_Content_Visit_DE_Devs&amp;sc_segment=DEDevs" target="_blank">Leg jetzt los und entwickle deinen Skill!</a></p> /blogs/alexa/post/fc3a3e60-30d7-45d7-8416-af264ff45169/alexa-kids-skills-now-available-in-australia-and-new-zealand Alexa Kid Skills Now Available in Australia and New Zealand James Ang 2018-07-17T00:00:00+00:00 2018-07-20T02:30:09+00:00 <p><img alt="" src="" style="height:240px; width:954px" /></p> <p>We are excited to announce that Alexa now supports kid skills in Australia and New Zealand. Aussie and Kiwi developers can now use the <a href="" target="_blank">Australia and New Zealand Alexa Skills Kit</a> to create skills that educate, entertain, and engage kids.</p> <p><img alt="" src="" style="height:240px; width:954px" /></p> <p>We are excited to announce that Alexa now supports kid skills in Australia and New Zealand. Aussie and Kiwi developers can now use the <a href="" target="_blank">Australia and New Zealand Alexa Skills Kit</a> to create skills that educate, entertain, and engage kids. From interactive games to instructional skills, you can create engaging kid-friendly voice experiences that will entertain the whole family and make them available in the <a href=";node=4931595051" target="_blank">Australia Alexa Skills Store</a>.</p> <h2>How It Works</h2> <p>Parents can turn on kid skills using the <a href=";nodeId=201549920" target="_blank">Alexa app</a>. When a kid skill is enabled for the first time, Alexa will ask the parent to turn on access to all kid skills by enabling the “Allow Kids Skills” toggle under Settings / Kids Skills in the Alexa app. Access to kid skills only need to be turned on once to enable and use all kid skills on the parent’s account. Like with any other Alexa skill, each kid skill will need to be enabled separately. Parents can turn off all kid skills at any time by disabling the “Allow Kids Skills” toggle in the Settings menu of their Alexa app. When turned off, kid skills cannot be used on the parent’s account.</p> <p>Join developers around the world who have already created engaging and award-winning Alexa kid skills for the whole family. Get inspired from the winners of the <a href="" target="_blank">Alexa Skills Challenge: Kids</a>.</p> <h2>3 Resources to Get Started</h2> <p>You have a unique opportunity to reach a whole new audience with your skills, as kids are quick to take to voice experiences and talk to Alexa in a way that’s uniquely their own. This means there are a few key things to keep in mind as you build kid skills—from vocabulary to style of speech to areas of interest. Here are 3 recommended resources to help you start building engaging kid skills:</p> <ol> <li>Download our guide on <a href="" target="_blank">6 Tips for Building Stellar Kid Skills</a> and <a href="" target="_blank">watch our video</a> for step-by-step tips and examples.</li> <li>Check out our tutorials and templates to get inspired, including the <a href="" target="_blank">Mix Master Kid Skill</a>, <a href="" target="_blank">Interactive Adventure Games</a>, <a href="" target="_blank">Quiz Games</a>, and <a href="" target="_blank">Trivia Games</a>.</li> <li>Review the <a href="" target="_blank">Certification Guidelines for Kid Skills</a> for best practices to ensure your skill is published smoothly.</li> </ol> <h2>Build Engaging Skills, Earn Developer Perks</h2> <p>Publish a new skill this month, including your engaging kid skill, and earn an exclusive Alexa developer t-shirt. If more than 30 unique users use your skill in the first 30 days, you could also earn an Echo Dot. <a href="" target="_blank">Learn more</a> about our promotion and start building today.</p> /blogs/appstore/post/ca8ce405-5674-4528-a81d-0584ff1d8bfb/announcing-monthly-gameon-developer-office-hours Announcing Monthly GameOn Developer Office Hours Tess Selim 2018-07-16T21:08:54+00:00 2018-07-16T21:26:01+00:00 <p><img alt="" src="" style="display:block; height:350px; margin-left:auto; margin-right:auto; width:700px" /></p> <p>During these office hours, you will be able to ask your technical questions, view live code demos, and discuss your GameOn use case. We will also explore best practices for competition management, real-world prizes, and more.<br /> &nbsp;</p> <p><img alt="" src="" style="display:block; height:350px; margin-left:auto; margin-right:auto; width:700px" />Over the past few weeks, I've had the opportunity to chat with Amazon GameOn developers at events like Nordic Game Jam and Develop: Brighton. The direct feedback and questions I receive from you help influence the GameOn product roadmap.<br /> <br /> I'm thrilled to extend this conversation to GameOn developers everywhere with the addition of monthly GameOn office hours. Our goal is to help you seamlessly integrate and offer the best competitive play experiences for your players.<br /> <br /> During these office hours, you will be able to ask your technical questions, view live code demos, and discuss your GameOn use case. We will also explore best practices for competition management, real-world prizes, and more.<br /> <br /> Office hours are offered on the second Thursday of every month. Register to reserve your spot for August 9 and send in your questions.</p> <p><a href="" target="_blank"><img alt="" src="" style="display:block; height:50px; margin-left:auto; margin-right:auto; width:200px" /></a></p> <h2>Get started with GameOn</h2> <p>Are you new to GameOn? <a href="" target="_blank">Get started today</a>, it's easy and quick! Some developers have even been able to set up competitions in their game with GameOn in as little as one day. You can also learn more about how to integrate competitive play into your game by watching <a href="" target="_blank">this webinar</a> on-demand.</p> <h2>About GameOn</h2> <p>GameOn is a set of flexible APIs built on AWS cloud infrastructure and works on any operating system, giving you the ability to scale quickly, while allowing you to invest more time in what you do best—designing great games. With GameOn, you have an easy tool to bring more players in on the action—allowing them to compete for real-world prizes fulfilled by Amazon or other in-game rewards. Drive engagement and increase monetization of your games by adding leaderboards, leagues, and multi-round competitions to your games, or strengthen your fanbase by allowing players and streamers to create their own user-generated competitions.</p>