<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Eli's Motion & Interaction Blog]]></title><description><![CDATA[Exploring the crossroads of animation and interaction design.]]></description><link>https://elisawicki.blog</link><image><url>https://substackcdn.com/image/fetch/$s_!1-cT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5035ae04-63a4-4887-96e0-b25bce0ce0a0_330x330.png</url><title>Eli&apos;s Motion &amp; Interaction Blog</title><link>https://elisawicki.blog</link></image><generator>Substack</generator><lastBuildDate>Wed, 13 May 2026 17:56:04 GMT</lastBuildDate><atom:link href="https://elisawicki.blog/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Eli Sawicki LLC]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[motion@elisawicki.co]]></webMaster><itunes:owner><itunes:email><![CDATA[motion@elisawicki.co]]></itunes:email><itunes:name><![CDATA[Eli Sawicki]]></itunes:name></itunes:owner><itunes:author><![CDATA[Eli Sawicki]]></itunes:author><googleplay:owner><![CDATA[motion@elisawicki.co]]></googleplay:owner><googleplay:email><![CDATA[motion@elisawicki.co]]></googleplay:email><googleplay:author><![CDATA[Eli Sawicki]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How exactly is Duolingo using Rive for their character animation?]]></title><description><![CDATA[An in-depth analysis.]]></description><link>https://elisawicki.blog/p/how-exactly-is-duolingo-using-rive</link><guid isPermaLink="false">https://elisawicki.blog/p/how-exactly-is-duolingo-using-rive</guid><dc:creator><![CDATA[Eli Sawicki]]></dc:creator><pubDate>Wed, 22 Nov 2023 01:02:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!All_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!All_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 424w, https://substackcdn.com/image/fetch/$s_!All_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 848w, https://substackcdn.com/image/fetch/$s_!All_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 1272w, https://substackcdn.com/image/fetch/$s_!All_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!All_!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png" width="1200" height="740.4" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:617,&quot;width&quot;:1000,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:195337,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!All_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 424w, https://substackcdn.com/image/fetch/$s_!All_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 848w, https://substackcdn.com/image/fetch/$s_!All_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 1272w, https://substackcdn.com/image/fetch/$s_!All_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec02836f-9698-4b92-8828-00e90cbb5fe6_1000x617.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A peek inside Duolingo&#8217;s Rive setup. <a href="https://blog.duolingo.com/world-character-visemes/">Source</a></figcaption></figure></div><p>In the process of appeasing Duo, <a href="https://youtu.be/vSbLodfSd08">so I don&#8217;t find out "what happens&#8221;,</a> I&#8217;ve spent a <em>lot </em>of time staring at their colorful cast of characters. I&#8217;ve wondered how they always feel so responsive. After stumbling across <a href="https://blog.duolingo.com/world-character-visemes/">this post</a> Duolingo put out, I feel I&#8217;ve come to some answers on just what makes them move in <a href="https://rive.app/">Rive</a>. I&#8217;m not only using this as a way to learn from them but also teach you a little on how Rive works. Let&#8217;s dive in!</p><div><hr></div><h2>Artboards + Hierarchy</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZH9d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZH9d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 424w, https://substackcdn.com/image/fetch/$s_!ZH9d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 848w, https://substackcdn.com/image/fetch/$s_!ZH9d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 1272w, https://substackcdn.com/image/fetch/$s_!ZH9d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZH9d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png" width="1456" height="631" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:631,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:485383,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZH9d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 424w, https://substackcdn.com/image/fetch/$s_!ZH9d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 848w, https://substackcdn.com/image/fetch/$s_!ZH9d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 1272w, https://substackcdn.com/image/fetch/$s_!ZH9d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21a90007-fea3-4d9b-9d4d-9342f576174c_1962x850.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot of Duolingo&#8217;s Rive project file for their character Lily. <a href="https://blog.duolingo.com/world-character-visemes/">Source</a></figcaption></figure></div><p>Art assets are broken up into <a href="https://help.rive.app/editor/fundamentals/nested-artboards">nested artboards</a> (red circles), these are proxies for other artboards (red underline), which are then combined into a main &#8216;Character&#8217; artboard. This highlighted artboard, outlined in light blue, controls Lily during a lesson.</p><p>The fact they&#8217;re using nested artboards for each asset could suggest there are multiple &#8216;Character&#8217; artboards in this project for different portions in the app; as this would allow them to keep assets consistent across them. For instance, the character&#8217;s joints are displayed in a T-pose on the artboard to the left with teal circles showing pivot areas. This would be used for internal reference.</p><p>Although, I&#8217;m not 100% sure Rive is being used fully across the app, because the only other area I could find these characters in was the celebration state after a lesson is completed. And, in these celebrations the character animation is radically different from what I can see is possible with this rig. For instance, there are smear frames in the limbs of some that couldn&#8217;t happen when organized the way they are in this screenshot. As well as there being full side profiles of the face &amp; bodies.</p><p>These are most likely rendered in <a href="https://lottiefiles.com/">Lottie</a> the same way their <a href="https://www.duolingo.com/">hero element</a> is on their website.</p><div id="youtube2-zG2-cwQ_WHc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;zG2-cwQ_WHc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/zG2-cwQ_WHc?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h6>A collection of in-app screen recordings of Duolingo&#8217;s celebration scenes. <a href="https://www.youtube.com/watch?v=zG2-cwQ_WHc">Source</a></h6><p></p><p>The character itself is made up of a series of grouped bones that are split between the legs and hip, at least in Lily&#8217;s case here. These bones don&#8217;t seem to be binded to any paths but exclusively used for hierarchy linking. The floating group icons (blue circles) hint to me that some objects are being controlled by constraints. <a href="https://help.rive.app/editor/constraints">Constraints</a> are assigned to objects in the hierarchy to control attributes of an object through another target object. One potential use for this is seen in the group icon between her eyes for controlling the eyelids.</p><div><hr></div><h2>Animations + Inputs</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ngp-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ngp-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 424w, https://substackcdn.com/image/fetch/$s_!ngp-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 848w, https://substackcdn.com/image/fetch/$s_!ngp-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 1272w, https://substackcdn.com/image/fetch/$s_!ngp-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ngp-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png" width="754" height="544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:544,&quot;width&quot;:754,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63398,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ngp-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 424w, https://substackcdn.com/image/fetch/$s_!ngp-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 848w, https://substackcdn.com/image/fetch/$s_!ngp-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 1272w, https://substackcdn.com/image/fetch/$s_!ngp-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a0782ee-95b4-4a3f-9167-14907927ec28_754x544.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot of Duolingo&#8217;s Rive animation &amp; input tabs. <a href="https://blog.duolingo.com/world-character-visemes/">Source</a></figcaption></figure></div><p>In Rive, the animation tab holds timelines (blue + green underlines) and state machines (red underline). <a href="https://help.rive.app/editor/animate-mode/timeline">A timeline</a> is a collection of key frames that can be set to either one shot, loop or ping pong across them. <a href="https://help.rive.app/editor/state-machine/inputs">Inputs</a> are a set of variables specific to one state machine to control transitions and blend states. I&#8217;ll break down state machines in the next section</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fd6p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fd6p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 424w, https://substackcdn.com/image/fetch/$s_!fd6p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 848w, https://substackcdn.com/image/fetch/$s_!fd6p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 1272w, https://substackcdn.com/image/fetch/$s_!fd6p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fd6p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png" width="172" height="186" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:186,&quot;width&quot;:172,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5073,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fd6p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 424w, https://substackcdn.com/image/fetch/$s_!fd6p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 848w, https://substackcdn.com/image/fetch/$s_!fd6p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 1272w, https://substackcdn.com/image/fetch/$s_!fd6p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfcca831-fe1c-4908-8066-f4581ba99c77_172x186.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Rive timeline types.</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w4Fz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w4Fz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 424w, https://substackcdn.com/image/fetch/$s_!w4Fz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 848w, https://substackcdn.com/image/fetch/$s_!w4Fz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 1272w, https://substackcdn.com/image/fetch/$s_!w4Fz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w4Fz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png" width="130" height="202" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:202,&quot;width&quot;:130,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3494,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w4Fz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 424w, https://substackcdn.com/image/fetch/$s_!w4Fz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 848w, https://substackcdn.com/image/fetch/$s_!w4Fz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 1272w, https://substackcdn.com/image/fetch/$s_!w4Fz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b2fc796-3e8a-49f0-a881-e905eecaa6be_130x202.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Rive input types.</figcaption></figure></div><p>Duo has a group of timelines (blue underlines) for controlling the basic state loop of each section from a lesson: <em>idle &#8594; correct/incorrect &#8594; idle_reset</em>. The transitions for these timelines are controlled by trigger inputs, seen on the right, named <em>&#8216;Correct&#8217;, &#8216;Incorrect&#8217; and &#8216;Reset&#8217;</em>. These triggers are accessible to the Duo Devs to use in the app.</p><div class="pullquote"><p>A <strong>viseme</strong> is a visual representation of a <strong>phoneme</strong>. </p></div><p>The other group of timelines (green underlines) probably consist of the path data of every shape for each viseme. This is supported by the naming conventions on their viseme charts matching the timeline names here. Each of these timelines have a corresponding number input of the same name.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OcNq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OcNq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 424w, https://substackcdn.com/image/fetch/$s_!OcNq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 848w, https://substackcdn.com/image/fetch/$s_!OcNq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 1272w, https://substackcdn.com/image/fetch/$s_!OcNq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OcNq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png" width="1147" height="643" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:643,&quot;width&quot;:1147,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:354252,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OcNq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 424w, https://substackcdn.com/image/fetch/$s_!OcNq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 848w, https://substackcdn.com/image/fetch/$s_!OcNq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 1272w, https://substackcdn.com/image/fetch/$s_!OcNq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77bce387-bcfd-4672-837a-9e62372adefd_1147x643.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot of Oscar&#8217;s viseme chart shown as part of Duolingo Duocon 2023. <a href="https://youtu.be/fgOqvyPif3g">Source</a></figcaption></figure></div><p>My guess is that these numbered inputs are used to drive an <a href="https://help.rive.app/editor/state-machine/states">Additive Blend state</a> that holds every viseme timeline in it. An Additive Blend state takes in multiple timelines and blends them together using multiple inputs. Each timeline is assigned its own input. So when the input &#8216;103&#8217; is set to 100 the connected &#8216;103&#8217; timeline is influencing that state by 100%. We can now animate between any 2 visemes by transitioning both inputs at the same rate from 100 to 0 and 0 to 100.</p><p>Borrowing this mouth from <a href="https://jctoon.myportfolio.com/">JcToon&#8217;s</a> phenomenal <a href="https://rive.app/community/3469-7899-login-screen-character/">login/signup experience</a> to test my theory, I created a small-scale example. This is using 3 timelines in an additive blend state. Each timeline holds the path data of all effected shapes to make the different faces. Then I simply adjusted the values to tween between the different mouth shapes. It only shows 3 here but this can scale to support any number of variations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!B43q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B43q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 424w, https://substackcdn.com/image/fetch/$s_!B43q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 848w, https://substackcdn.com/image/fetch/$s_!B43q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 1272w, https://substackcdn.com/image/fetch/$s_!B43q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!B43q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif" width="1190" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:390,&quot;width&quot;:1190,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:244562,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!B43q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 424w, https://substackcdn.com/image/fetch/$s_!B43q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 848w, https://substackcdn.com/image/fetch/$s_!B43q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 1272w, https://substackcdn.com/image/fetch/$s_!B43q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc470e1d4-b285-47ea-ac1c-a4bb98655a42_1190x390.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A small-scale example of how I think Duolingo rigged their talking system in Rive.</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lcva!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lcva!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 424w, https://substackcdn.com/image/fetch/$s_!lcva!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 848w, https://substackcdn.com/image/fetch/$s_!lcva!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 1272w, https://substackcdn.com/image/fetch/$s_!lcva!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lcva!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png" width="388" height="307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:307,&quot;width&quot;:388,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12199,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lcva!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 424w, https://substackcdn.com/image/fetch/$s_!lcva!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 848w, https://substackcdn.com/image/fetch/$s_!lcva!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 1272w, https://substackcdn.com/image/fetch/$s_!lcva!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed51b1dd-0462-4540-8e19-0ca6b9f7aad7_388x307.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is how I set up the Additive Blend state. Timelines on the left with matching inputs on the right.</figcaption></figure></div><p>One thing that pushed me towards this method was when you slow down in-app screen recordings you can actually see it tweening between the different mouth shapes. When played back at normal talking speeds it creates some really smooth animation. Another benefit is it allows for flexible timings that not only account for snappy transitions but slower ones with no distracting breaks in the flow.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tp6Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 424w, https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 848w, https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 1272w, https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif" width="980" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:980,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3177019,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 424w, https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 848w, https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 1272w, https://substackcdn.com/image/fetch/$s_!Tp6Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff40e56ae-3ad9-4a39-a816-7365c14b2259_980x485.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A screen recording at 60fps. Slowed down 6x to show tweening.</figcaption></figure></div><p>There are more prominent examples of tweening on slower phrases. Such as this screen recording of Lucy in a lesson. Notice some transitions don&#8217;t always matchup perfectly. This occurs when a timeline has objects that aren&#8217;t visible in another timeline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bPrh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bPrh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 424w, https://substackcdn.com/image/fetch/$s_!bPrh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 848w, https://substackcdn.com/image/fetch/$s_!bPrh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 1272w, https://substackcdn.com/image/fetch/$s_!bPrh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bPrh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif" width="350" height="350" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:350,&quot;width&quot;:350,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:430737,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bPrh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 424w, https://substackcdn.com/image/fetch/$s_!bPrh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 848w, https://substackcdn.com/image/fetch/$s_!bPrh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 1272w, https://substackcdn.com/image/fetch/$s_!bPrh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63fe0a16-45d8-4ec8-8780-5fb81363beab_350x350.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A slower phrase that has more prominent tweening.</figcaption></figure></div><p>The rate between these states are dynamically driven by some coding magic that takes into account the timing of everything in the sentence.</p><blockquote><p>&#8220;To create accurate animations, we generate the speech, run it through our in-house speech recognition and pronunciation models, and get the timing for each word and <strong>phoneme</strong> (speech sound).&#8221; <a href="https://blog.duolingo.com/world-character-visemes/">(Jasmine Vahidsafa &amp; Kevin Lenzo)</a></p></blockquote><p>My focus on this is simply how it&#8217;s set up in Rive and handed to the devs to control.</p><div><hr></div><h2>State Machine</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mPRL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mPRL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 424w, https://substackcdn.com/image/fetch/$s_!mPRL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 848w, https://substackcdn.com/image/fetch/$s_!mPRL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 1272w, https://substackcdn.com/image/fetch/$s_!mPRL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mPRL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png" width="1050" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:1050,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56216,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mPRL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 424w, https://substackcdn.com/image/fetch/$s_!mPRL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 848w, https://substackcdn.com/image/fetch/$s_!mPRL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 1272w, https://substackcdn.com/image/fetch/$s_!mPRL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6ac16-6867-4dfb-8852-43f348cf8c2c_1050x549.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot of Duolingo&#8217;s Rive State Machine. <a href="https://blog.duolingo.com/world-character-visemes/">Source</a></figcaption></figure></div><p>This is where the <a href="https://youtu.be/Q4vryZTr6MA">potatoes and molasses</a> are of Rive! A <a href="https://help.rive.app/editor/state-machine">state machine</a> is made of <a href="https://help.rive.app/editor/state-machine/layers">layers</a>. Each layer has <a href="https://help.rive.app/editor/state-machine/states">states</a> that control timelines with <a href="https://help.rive.app/editor/state-machine/transitions">transitions</a> connecting them together. Transitions have the ability to tween between timelines and create conditions for when to execute a transition.</p><p>This state machine is controlling a character while in a lesson. It has 2 layers. The first layer &#8216;Character Animation&#8217; controls the core cycle of idle &#8594; correct/incorrect &#8594; idle reset and the second is the aforementioned talking system. These are both ran at the same time. So, if an audio is triggered it will continue in the state it was already in. The idling loop consists of a variety of behaviors &#8212; head nods, blinking, subtle pupil movements, eyebrows moving, looking left or right or up &#8212; that trigger in 10 second loops. These behaviors are sometimes isolated or combined to make larger movements.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-muX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-muX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 424w, https://substackcdn.com/image/fetch/$s_!-muX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 848w, https://substackcdn.com/image/fetch/$s_!-muX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 1272w, https://substackcdn.com/image/fetch/$s_!-muX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-muX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif" width="423" height="419" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:419,&quot;width&quot;:423,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1777048,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-muX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 424w, https://substackcdn.com/image/fetch/$s_!-muX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 848w, https://substackcdn.com/image/fetch/$s_!-muX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 1272w, https://substackcdn.com/image/fetch/$s_!-muX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46c10b6e-ce12-4b61-9e05-ebbcfba54228_423x419.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This sulking idle loop for Lily runs for around 10 seconds.</figcaption></figure></div><p>Every character has their own unique idle loop. They all seem to run around the same time with a larger movement in the middle like Lily slightly moving her hair. These idle loops are transitioned into either a correct or incorrect animation that plays once before going back to the idle loop.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O3wZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O3wZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 424w, https://substackcdn.com/image/fetch/$s_!O3wZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 848w, https://substackcdn.com/image/fetch/$s_!O3wZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 1272w, https://substackcdn.com/image/fetch/$s_!O3wZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O3wZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif" width="423" height="419" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:419,&quot;width&quot;:423,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:975722,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O3wZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 424w, https://substackcdn.com/image/fetch/$s_!O3wZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 848w, https://substackcdn.com/image/fetch/$s_!O3wZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 1272w, https://substackcdn.com/image/fetch/$s_!O3wZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf6c52bb-f94c-435e-95b0-a6b7cbde5632_423x419.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Lucy&#8217;s celebration state animation.</figcaption></figure></div><div><hr></div><h2>Conclusion</h2><p>Duolingo uses Rive in an ingenious way to allow for responsive and interactive characters during their language lessons. With an additive blend state, they&#8217;re able to seamlessly tween between any mouth state and time it perfectly to each spoken phoneme using their in-house speech recognition and pronunciation models. This is combined with a state machine that brings the characters to life, allowing them to react to your answers in real-time. Weaving beautiful character animation with the marvel of interactive tech found in Rive it creates a dynamic, character-driven experience like no other to keep you coming back to a very persistent green owl.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-hpp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-hpp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 424w, https://substackcdn.com/image/fetch/$s_!-hpp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 848w, https://substackcdn.com/image/fetch/$s_!-hpp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 1272w, https://substackcdn.com/image/fetch/$s_!-hpp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-hpp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp" width="700" height="473" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:473,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16930,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-hpp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 424w, https://substackcdn.com/image/fetch/$s_!-hpp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 848w, https://substackcdn.com/image/fetch/$s_!-hpp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 1272w, https://substackcdn.com/image/fetch/$s_!-hpp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a08f9f8-eec3-426f-a8a1-fd79f1e363bd_700x473.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Have you completed your lessons today?</figcaption></figure></div><p>I hope this was helpful! You&#8217;re now equipped to go out and build your own character rigs in Rive like Duolingo!</p><p>If you have any questions feel free to reach me at <a href="https://www.elisawicki.co/about-contact#contact">elisawicki.co/contact</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://elisawicki.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Eli's Motion &amp; Interaction Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://elisawicki.blog/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Eli's Motion &amp; Interaction Blog&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://elisawicki.blog/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Eli's Motion &amp; Interaction Blog</span></a></p>]]></content:encoded></item></channel></rss>