<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>DrivenData Labs</title><link href="https://www.drivendata.co/" rel="alternate"></link><link href="https://www.drivendata.co/feeds/all.atom.xml" rel="self"></link><id>https://www.drivendata.co/</id><updated>2026-03-10T00:00:00-04:00</updated><entry><title>Improving Automatic Speech Recognition for Kids - A Reference Implementation for Phonetic-level Transcription</title><link href="https://www.drivendata.co/blog/child-asr-phonetic-reference-implementation" rel="alternate"></link><published>2026-03-10T00:00:00-04:00</published><updated>2026-03-10T00:00:00-04:00</updated><author><name>Jackie Glasheen</name></author><id>tag:www.drivendata.co,2026-03-10:/blog/child-asr-phonetic-reference-implementation</id><summary type="html">&lt;p&gt;A step-by-step guide to training a model to predict phonetic symbols for the On Top of Pasketti Challenge (Phonetic Track)&lt;/p&gt;</summary><content type="html">&lt;style type="text/css"&gt;/*!
*
* IPython notebook
*
*/
/* CSS font colors for translated ANSI escape sequences */
/* The color values are a mix of
   http://www.xcolors.net/dl/baskerville-ivorylight and
   http://www.xcolors.net/dl/euphrasia */
.ansi-black-fg {
  color: #3E424D;
}
.ansi-black-bg {
  background-color: #3E424D;
}
.ansi-black-intense-fg {
  color: #282C36;
}
.ansi-black-intense-bg {
  background-color: #282C36;
}
.ansi-red-fg {
  color: #E75C58;
}
.ansi-red-bg {
  background-color: #E75C58;
}
.ansi-red-intense-fg {
  color: #B22B31;
}
.ansi-red-intense-bg {
  background-color: #B22B31;
}
.ansi-green-fg {
  color: #00A250;
}
.ansi-green-bg {
  background-color: #00A250;
}
.ansi-green-intense-fg {
  color: #007427;
}
.ansi-green-intense-bg {
  background-color: #007427;
}
.ansi-yellow-fg {
  color: #DDB62B;
}
.ansi-yellow-bg {
  background-color: #DDB62B;
}
.ansi-yellow-intense-fg {
  color: #B27D12;
}
.ansi-yellow-intense-bg {
  background-color: #B27D12;
}
.ansi-blue-fg {
  color: #208FFB;
}
.ansi-blue-bg {
  background-color: #208FFB;
}
.ansi-blue-intense-fg {
  color: #0065CA;
}
.ansi-blue-intense-bg {
  background-color: #0065CA;
}
.ansi-magenta-fg {
  color: #D160C4;
}
.ansi-magenta-bg {
  background-color: #D160C4;
}
.ansi-magenta-intense-fg {
  color: #A03196;
}
.ansi-magenta-intense-bg {
  background-color: #A03196;
}
.ansi-cyan-fg {
  color: #60C6C8;
}
.ansi-cyan-bg {
  background-color: #60C6C8;
}
.ansi-cyan-intense-fg {
  color: #258F8F;
}
.ansi-cyan-intense-bg {
  background-color: #258F8F;
}
.ansi-white-fg {
  color: #C5C1B4;
}
.ansi-white-bg {
  background-color: #C5C1B4;
}
.ansi-white-intense-fg {
  color: #A1A6B2;
}
.ansi-white-intense-bg {
  background-color: #A1A6B2;
}
.ansi-default-inverse-fg {
  color: #FFFFFF;
}
.ansi-default-inverse-bg {
  background-color: #000000;
}
.ansi-bold {
  font-weight: bold;
}
.ansi-underline {
  text-decoration: underline;
}
/* The following styles are deprecated an will be removed in a future version */
.ansibold {
  font-weight: bold;
}
.ansi-inverse {
  outline: 0.5px dotted;
}
/* use dark versions for foreground, to improve visibility */
.ansiblack {
  color: black;
}
.ansired {
  color: darkred;
}
.ansigreen {
  color: darkgreen;
}
.ansiyellow {
  color: #c4a000;
}
.ansiblue {
  color: darkblue;
}
.ansipurple {
  color: darkviolet;
}
.ansicyan {
  color: steelblue;
}
.ansigray {
  color: gray;
}
/* and light for background, for the same reason */
.ansibgblack {
  background-color: black;
}
.ansibgred {
  background-color: red;
}
.ansibggreen {
  background-color: green;
}
.ansibgyellow {
  background-color: yellow;
}
.ansibgblue {
  background-color: blue;
}
.ansibgpurple {
  background-color: magenta;
}
.ansibgcyan {
  background-color: cyan;
}
.ansibggray {
  background-color: gray;
}
div.cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-radius: 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  border-width: 1px;
  border-style: solid;
  border-color: transparent;
  width: 100%;
  padding: 5px;
  /* This acts as a spacer between cells, that is outside the border */
  margin: 0px;
  outline: none;
  position: relative;
  overflow: visible;
}
div.cell:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: transparent;
}
div.cell.jupyter-soft-selected {
  border-left-color: #E3F2FD;
  border-left-width: 1px;
  padding-left: 5px;
  border-right-color: #E3F2FD;
  border-right-width: 1px;
  background: #E3F2FD;
}
@media print {
  div.cell.jupyter-soft-selected {
    border-color: transparent;
  }
}
div.cell.selected,
div.cell.selected.jupyter-soft-selected {
  border-color: #ababab;
}
div.cell.selected:before,
div.cell.selected.jupyter-soft-selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #42A5F5;
}
@media print {
  div.cell.selected,
  div.cell.selected.jupyter-soft-selected {
    border-color: transparent;
  }
}
.edit_mode div.cell.selected {
  border-color: #66BB6A;
}
.edit_mode div.cell.selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #66BB6A;
}
@media print {
  .edit_mode div.cell.selected {
    border-color: transparent;
  }
}
.prompt {
  /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
  min-width: 14ex;
  /* This padding is tuned to match the padding on the CodeMirror editor. */
  padding: 0.4em;
  margin: 0px;
  font-family: monospace;
  text-align: right;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
  /* Don't highlight prompt number selection */
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  /* Use default cursor */
  cursor: default;
}
@media (max-width: 540px) {
  .prompt {
    text-align: left;
  }
}
div.inner_cell {
  min-width: 0;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_area {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
}
/* This is needed so that empty prompt areas can collapse to zero height when there
   is no content in the output_subarea and the prompt. The main purpose of this is
   to make sure that empty JavaScript output_subareas have no height. */
div.prompt:empty {
  padding-top: 0;
  padding-bottom: 0;
}
div.unrecognized_cell {
  padding: 5px 5px 5px 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.unrecognized_cell .inner_cell {
  border-radius: 2px;
  padding: 5px;
  font-weight: bold;
  color: red;
  border: 1px solid #cfcfcf;
  background: #eaeaea;
}
div.unrecognized_cell .inner_cell a {
  color: inherit;
  text-decoration: none;
}
div.unrecognized_cell .inner_cell a:hover {
  color: inherit;
  text-decoration: none;
}
@media (max-width: 540px) {
  div.unrecognized_cell &gt; div.prompt {
    display: none;
  }
}
div.code_cell {
  /* avoid page breaking on code cells when printing */
}
@media print {
  div.code_cell {
    page-break-inside: avoid;
  }
}
/* any special styling for code cells that are currently running goes here */
div.input {
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.input {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_prompt {
  color: #303F9F;
  border-top: 1px solid transparent;
}
div.input_area &gt; div.highlight {
  margin: 0.4em;
  border: none;
  padding: 0px;
  background-color: transparent;
}
div.input_area &gt; div.highlight &gt; pre {
  margin: 0px;
  border: none;
  padding: 0px;
  background-color: transparent;
}
/* The following gets added to the &lt;head&gt; if it is detected that the user has a
 * monospace font with inconsistent normal/bold/italic height.  See
 * notebookmain.js.  Such fonts will have keywords vertically offset with
 * respect to the rest of the text.  The user should select a better font.
 * See: https://github.com/ipython/ipython/issues/1503
 *
 * .CodeMirror span {
 *      vertical-align: bottom;
 * }
 */
.CodeMirror {
  line-height: 1.21429em;
  /* Changed from 1em to our global default */
  font-size: 14px;
  height: auto;
  /* Changed to auto to autogrow */
  background: none;
  /* Changed from white to allow our bg to show through */
}
.CodeMirror-scroll {
  /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
  /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
  overflow-y: hidden;
  overflow-x: auto;
}
.CodeMirror-lines {
  /* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because */
  /* we have set a different line-height and want this to scale with that. */
  /* Note that this should set vertical padding only, since CodeMirror assumes
       that horizontal padding will be set on CodeMirror pre */
  padding: 0.4em 0;
}
.CodeMirror-linenumber {
  padding: 0 8px 0 4px;
}
.CodeMirror-gutters {
  border-bottom-left-radius: 2px;
  border-top-left-radius: 2px;
}
.CodeMirror pre {
  /* In CM3 this went to 4px from 0 in CM2. This sets horizontal padding only,
    use .CodeMirror-lines for vertical */
  padding: 0 0.4em;
  border: 0;
  border-radius: 0;
}
.CodeMirror-cursor {
  border-left: 1.4px solid black;
}
@media screen and (min-width: 2138px) and (max-width: 4319px) {
  .CodeMirror-cursor {
    border-left: 2px solid black;
  }
}
@media screen and (min-width: 4320px) {
  .CodeMirror-cursor {
    border-left: 4px solid black;
  }
}
/*

Original style from softwaremaniacs.org (c) Ivan Sagalaev &lt;Maniac@SoftwareManiacs.Org&gt;
Adapted from GitHub theme

*/
.highlight-base {
  color: #000;
}
.highlight-variable {
  color: #000;
}
.highlight-variable-2 {
  color: #1a1a1a;
}
.highlight-variable-3 {
  color: #333333;
}
.highlight-string {
  color: #BA2121;
}
.highlight-comment {
  color: #408080;
  font-style: italic;
}
.highlight-number {
  color: #080;
}
.highlight-atom {
  color: #88F;
}
.highlight-keyword {
  color: #008000;
  font-weight: bold;
}
.highlight-builtin {
  color: #008000;
}
.highlight-error {
  color: #f00;
}
.highlight-operator {
  color: #AA22FF;
  font-weight: bold;
}
.highlight-meta {
  color: #AA22FF;
}
/* previously not defined, copying from default codemirror */
.highlight-def {
  color: #00f;
}
.highlight-string-2 {
  color: #f50;
}
.highlight-qualifier {
  color: #555;
}
.highlight-bracket {
  color: #997;
}
.highlight-tag {
  color: #170;
}
.highlight-attribute {
  color: #00c;
}
.highlight-header {
  color: blue;
}
.highlight-quote {
  color: #090;
}
.highlight-link {
  color: #00c;
}
/* apply the same style to codemirror */
.cm-s-ipython span.cm-keyword {
  color: #008000;
  font-weight: bold;
}
.cm-s-ipython span.cm-atom {
  color: #88F;
}
.cm-s-ipython span.cm-number {
  color: #080;
}
.cm-s-ipython span.cm-def {
  color: #00f;
}
.cm-s-ipython span.cm-variable {
  color: #000;
}
.cm-s-ipython span.cm-operator {
  color: #AA22FF;
  font-weight: bold;
}
.cm-s-ipython span.cm-variable-2 {
  color: #1a1a1a;
}
.cm-s-ipython span.cm-variable-3 {
  color: #333333;
}
.cm-s-ipython span.cm-comment {
  color: #408080;
  font-style: italic;
}
.cm-s-ipython span.cm-string {
  color: #BA2121;
}
.cm-s-ipython span.cm-string-2 {
  color: #f50;
}
.cm-s-ipython span.cm-meta {
  color: #AA22FF;
}
.cm-s-ipython span.cm-qualifier {
  color: #555;
}
.cm-s-ipython span.cm-builtin {
  color: #008000;
}
.cm-s-ipython span.cm-bracket {
  color: #997;
}
.cm-s-ipython span.cm-tag {
  color: #170;
}
.cm-s-ipython span.cm-attribute {
  color: #00c;
}
.cm-s-ipython span.cm-header {
  color: blue;
}
.cm-s-ipython span.cm-quote {
  color: #090;
}
.cm-s-ipython span.cm-link {
  color: #00c;
}
.cm-s-ipython span.cm-error {
  color: #f00;
}
.cm-s-ipython span.cm-tab {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
}
div.output_wrapper {
  /* this position must be relative to enable descendents to be absolute within it */
  position: relative;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  z-index: 1;
}
/* class for the output area when it should be height-limited */
div.output_scroll {
  /* ideally, this would be max-height, but FF barfs all over that */
  height: 24em;
  /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */
  width: 100%;
  overflow: auto;
  border-radius: 2px;
  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  display: block;
}
/* output div while it is collapsed */
div.output_collapsed {
  margin: 0px;
  padding: 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
div.out_prompt_overlay {
  height: 100%;
  padding: 0px 0.4em;
  position: absolute;
  border-radius: 2px;
}
div.out_prompt_overlay:hover {
  /* use inner shadow to get border that is computed the same on WebKit/FF */
  -webkit-box-shadow: inset 0 0 1px #000;
  box-shadow: inset 0 0 1px #000;
  background: rgba(240, 240, 240, 0.5);
}
div.output_prompt {
  color: #D84315;
}
/* This class is the outer container of all output sections. */
div.output_area {
  padding: 0px;
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.output_area .MathJax_Display {
  text-align: left !important;
}
div.output_area 
div.output_area 
div.output_area img,
div.output_area svg {
  max-width: 100%;
  height: auto;
}
div.output_area img.unconfined,
div.output_area svg.unconfined {
  max-width: none;
}
div.output_area .mglyph &gt; img {
  max-width: none;
}
/* This is needed to protect the pre formating from global settings such
   as that of bootstrap */
.output {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.output_area {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
div.output_area pre {
  margin: 0;
  padding: 1px 0 1px 0;
  border: 0;
  vertical-align: baseline;
  color: black;
  background-color: transparent;
  border-radius: 0;
}
/* This class is for the output subarea inside the output_area and after
   the prompt div. */
div.output_subarea {
  overflow-x: auto;
  padding: 0.4em;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
  max-width: calc(100% - 14ex);
}
div.output_scroll div.output_subarea {
  overflow-x: visible;
}
/* The rest of the output_* classes are for special styling of the different
   output types */
/* all text output has this class: */
div.output_text {
  text-align: left;
  color: #000;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
}
/* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
div.output_stderr {
  background: #fdd;
  /* very light red background for stderr */
}
div.output_latex {
  text-align: left;
}
/* Empty output_javascript divs should have no height */
div.output_javascript:empty {
  padding: 0;
}
.js-error {
  color: darkred;
}
/* raw_input styles */
div.raw_input_container {
  line-height: 1.21429em;
  padding-top: 5px;
}
pre.raw_input_prompt {
  /* nothing needed here. */
}
input.raw_input {
  font-family: monospace;
  font-size: inherit;
  color: inherit;
  width: auto;
  /* make sure input baseline aligns with prompt */
  vertical-align: baseline;
  /* padding + margin = 0.5em between prompt and cursor */
  padding: 0em 0.25em;
  margin: 0em 0.25em;
}
input.raw_input:focus {
  box-shadow: none;
}
p.p-space {
  margin-bottom: 10px;
}
div.output_unrecognized {
  padding: 5px;
  font-weight: bold;
  color: red;
}
div.output_unrecognized a {
  color: inherit;
  text-decoration: none;
}
div.output_unrecognized a:hover {
  color: inherit;
  text-decoration: none;
}
.rendered_html {
  color: #000;
  /* any extras will just be numbers: */
}



.rendered_html :link {
  text-decoration: underline;
}
.rendered_html :visited {
  text-decoration: underline;
}






.rendered_html h1:first-child {
  margin-top: 0.538em;
}
.rendered_html h2:first-child {
  margin-top: 0.636em;
}
.rendered_html h3:first-child {
  margin-top: 0.777em;
}
.rendered_html h4:first-child {
  margin-top: 1em;
}
.rendered_html h5:first-child {
  margin-top: 1em;
}
.rendered_html h6:first-child {
  margin-top: 1em;
}
.rendered_html ul:not(.list-inline),
.rendered_html ol:not(.list-inline) {
  padding-left: 2em;
}








.rendered_html * + ul {
  margin-top: 1em;
}
.rendered_html * + ol {
  margin-top: 1em;
}





.rendered_html pre,




.rendered_html tr,
.rendered_html th,


.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
.rendered_html * + table {
  margin-top: 1em;
}

.rendered_html * + p {
  margin-top: 1em;
}

.rendered_html * + img {
  margin-top: 1em;
}
.rendered_html img,

.rendered_html img.unconfined,


.rendered_html * + .alert {
  margin-top: 1em;
}
[dir="rtl"] 
div.text_cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.text_cell &gt; div.prompt {
    display: none;
  }
}
div.text_cell_render {
  /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
  outline: none;
  resize: none;
  width: inherit;
  border-style: none;
  padding: 0.5em 0.5em 0.5em 0.4em;
  color: #000;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
a.anchor-link:link {
  text-decoration: none;
  padding: 0px 20px;
  visibility: hidden;
}
h1:hover .anchor-link,
h2:hover .anchor-link,
h3:hover .anchor-link,
h4:hover .anchor-link,
h5:hover .anchor-link,
h6:hover .anchor-link {
  visibility: visible;
}
.text_cell.rendered .input_area {
  display: none;
}
.text_cell.rendered 
.text_cell.rendered .rendered_html tr,
.text_cell.rendered .rendered_html th,
.text_cell.rendered 
.text_cell.unrendered .text_cell_render {
  display: none;
}
.text_cell .dropzone .input_area {
  border: 2px dashed #bababa;
  margin: -1px;
}
.cm-header-1,
.cm-header-2,
.cm-header-3,
.cm-header-4,
.cm-header-5,
.cm-header-6 {
  font-weight: bold;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.cm-header-1 {
  font-size: 185.7%;
}
.cm-header-2 {
  font-size: 157.1%;
}
.cm-header-3 {
  font-size: 128.6%;
}
.cm-header-4 {
  font-size: 110%;
}
.cm-header-5 {
  font-size: 100%;
  font-style: italic;
}
.cm-header-6 {
  font-size: 100%;
  font-style: italic;
}
&lt;/style&gt;
&lt;style type="text/css"&gt;pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight pre  .hll { background-color: #ffffcc }
 .highlight pre  { background: #f8f8f8; }
 .highlight pre  .c { color: #3D7B7B; font-style: italic } /* Comment */
 .highlight pre  .err { border: 1px solid #F00 } /* Error */
 .highlight pre  .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight pre  .o { color: #666 } /* Operator */
 .highlight pre  .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
 .highlight pre  .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
 .highlight pre  .cp { color: #9C6500 } /* Comment.Preproc */
 .highlight pre  .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
 .highlight pre  .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
 .highlight pre  .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
 .highlight pre  .gd { color: #A00000 } /* Generic.Deleted */
 .highlight pre  .ge { font-style: italic } /* Generic.Emph */
 .highlight pre  .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
 .highlight pre  .gr { color: #E40000 } /* Generic.Error */
 .highlight pre  .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight pre  .gi { color: #008400 } /* Generic.Inserted */
 .highlight pre  .go { color: #717171 } /* Generic.Output */
 .highlight pre  .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight pre  .gs { font-weight: bold } /* Generic.Strong */
 .highlight pre  .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 .highlight pre  .gt { color: #04D } /* Generic.Traceback */
 .highlight pre  .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
 .highlight pre  .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
 .highlight pre  .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
 .highlight pre  .kp { color: #008000 } /* Keyword.Pseudo */
 .highlight pre  .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
 .highlight pre  .kt { color: #B00040 } /* Keyword.Type */
 .highlight pre  .m { color: #666 } /* Literal.Number */
 .highlight pre  .s { color: #BA2121 } /* Literal.String */
 .highlight pre  .na { color: #687822 } /* Name.Attribute */
 .highlight pre  .nb { color: #008000 } /* Name.Builtin */
 .highlight pre  .nc { color: #00F; font-weight: bold } /* Name.Class */
 .highlight pre  .no { color: #800 } /* Name.Constant */
 .highlight pre  .nd { color: #A2F } /* Name.Decorator */
 .highlight pre  .ni { color: #717171; font-weight: bold } /* Name.Entity */
 .highlight pre  .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
 .highlight pre  .nf { color: #00F } /* Name.Function */
 .highlight pre  .nl { color: #767600 } /* Name.Label */
 .highlight pre  .nn { color: #00F; font-weight: bold } /* Name.Namespace */
 .highlight pre  .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight pre  .nv { color: #19177C } /* Name.Variable */
 .highlight pre  .ow { color: #A2F; font-weight: bold } /* Operator.Word */
 .highlight pre  .w { color: #BBB } /* Text.Whitespace */
 .highlight pre  .mb { color: #666 } /* Literal.Number.Bin */
 .highlight pre  .mf { color: #666 } /* Literal.Number.Float */
 .highlight pre  .mh { color: #666 } /* Literal.Number.Hex */
 .highlight pre  .mi { color: #666 } /* Literal.Number.Integer */
 .highlight pre  .mo { color: #666 } /* Literal.Number.Oct */
 .highlight pre  .sa { color: #BA2121 } /* Literal.String.Affix */
 .highlight pre  .sb { color: #BA2121 } /* Literal.String.Backtick */
 .highlight pre  .sc { color: #BA2121 } /* Literal.String.Char */
 .highlight pre  .dl { color: #BA2121 } /* Literal.String.Delimiter */
 .highlight pre  .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
 .highlight pre  .s2 { color: #BA2121 } /* Literal.String.Double */
 .highlight pre  .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
 .highlight pre  .sh { color: #BA2121 } /* Literal.String.Heredoc */
 .highlight pre  .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
 .highlight pre  .sx { color: #008000 } /* Literal.String.Other */
 .highlight pre  .sr { color: #A45A77 } /* Literal.String.Regex */
 .highlight pre  .s1 { color: #BA2121 } /* Literal.String.Single */
 .highlight pre  .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight pre  .bp { color: #008000 } /* Name.Builtin.Pseudo */
 .highlight pre  .fm { color: #00F } /* Name.Function.Magic */
 .highlight pre  .vc { color: #19177C } /* Name.Variable.Class */
 .highlight pre  .vg { color: #19177C } /* Name.Variable.Global */
 .highlight pre  .vi { color: #19177C } /* Name.Variable.Instance */
 .highlight pre  .vm { color: #19177C } /* Name.Variable.Magic */
 .highlight pre  .il { color: #666 } /* Literal.Number.Integer.Long */&lt;/style&gt;&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Welcome to the reference implementation notebook for the &lt;strong&gt;On Top of Pasketti: Children's Speech Recognition Challenge - Phonetic Track&lt;/strong&gt;! If you are just getting started, we recommend reading the &lt;a href="https://www.drivendata.org/competitions/309/childrens-phonetic-asr/"&gt;competition webpage&lt;/a&gt; first.&lt;/p&gt;
&lt;p&gt;The goal of this tutorial is to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Demonstrate how to &lt;a href="#Step-1:-Load-and-explore-the-data"&gt;load and explore the data&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Provide a basic framework for &lt;a href="#Step-2:-Build-the-Model"&gt;building a model&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Walk through how to &lt;a href="#Step-3:-Make-your-submission"&gt;package your work&lt;/a&gt; correctly for submission.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We will be fine-tuning &lt;a href="https://huggingface.co/docs/transformers/en/model_doc/wav2vec2"&gt;Wav2Vec2&lt;/a&gt;, a pretrained speech representation model for automatic speech recognition ("ASR"), using the Hugging Face Transformers library. Wav2Vec2 converts raw audio into contextual acoustic representations through a convolutional feature extractor followed by a Transformer encoder.&lt;/p&gt;
&lt;p&gt;For this challenge, we adapt Wav2Vec2 to predict phonetic units (phones) represented by the International Phonetic Alphabet (IPA) rather than words or characters. While Wav2Vec2 is commonly fine-tuned for grapheme- or word-level ASR, its learned acoustic representations can also support phone-level prediction. By training the model with an IPA phone vocabulary and using &lt;a href="https://en.wikipedia.org/wiki/Connectionist_temporal_classification"&gt;Connectionist Temporal Classification (CTC)&lt;/a&gt;, we can learn to predict phone sequences directly from audio without requiring manual time alignment.&lt;/p&gt;
&lt;p&gt;You can either expand on and improve the method in this reference implementation, or start with something completely different! Let's get started.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Background"&gt;Background&lt;a class="anchor-link" href="#Background"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Spoken language is a natural way for kids to learn, explore, and show what they know, yet today's ASR technology hardly understands them. Most ASR systems are built on adult speech, and struggle with the pitch, rhythm, and evolving articulation of young learners.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.drivendata.org/competitions/group/childrens-asr-competition/"&gt;On Top of Pasketti: Children’s Speech Recognition Challenge&lt;/a&gt; assembles pre-existing and newly labeled datasets to advance speech models that truly work for children. Your goal in the &lt;a href="https://www.drivendata.org/competitions/309/childrens-phonetic-asr/"&gt;Phonetic Track&lt;/a&gt; is to develop models that accurately predict the speech sounds, or phones, spoken by children in audio clips. Phonetic models are critical for diagnostic applications like speech pathology screening.&lt;/p&gt;
&lt;p&gt;This is a &lt;a href="https://drivendata.co/blog/code-execution-competitions"&gt;code execution challenge&lt;/a&gt;! Rather than submitting your predicted labels, you will package your trained model and the prediction code and submit that for containerized execution. See the &lt;a href="https://www.drivendata.org/competitions/309/childrens-phonetic-asr/page/981/"&gt;code submission format&lt;/a&gt; webpage and the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main"&gt;runtime repository&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;If you'd like to rerun this notebook, the notebook file can be downloaded from the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub"&gt;reference implementation repository&lt;/a&gt;. That repository also includes all code imported into the notebook.&lt;/p&gt;
&lt;hr&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h1 id="Step-0:-Import-packages"&gt;Step 0: Import packages&lt;a class="anchor-link" href="#Step-0:-Import-packages"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;First, create your environment. We use &lt;code&gt;uv&lt;/code&gt; as the package manager in this reference implementation repository.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an environment: &lt;code&gt;just create-environment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Activate the environment: &lt;code&gt;source ./.venv/bin/activate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install the requirements found in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub/blob/main/pyproject.toml"&gt;TOML file&lt;/a&gt; into the environment: &lt;code&gt;just requirements&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Remember, the runtime repository's &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/blob/main/runtime/pyproject.toml"&gt;TOML file&lt;/a&gt; lists the packages that will be available for running inference using model submissions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We'll be using PyTorch and Hugging Face Transformers to build our model along with standard data science Python libraries to explore and prepare the data. Because this is a code execution challenge, we'll also be testing our solutions locally before packaging our model and inference code for submission. To help us with scoring, we've imported some utility functions from the competition's &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime"&gt;runtime repository&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Standard library&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;dataclasses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;random&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;typing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

&lt;span class="c1"&gt;# Data Science &amp;amp; Utilities&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;IPython.display&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;loguru&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tqdm&lt;/span&gt;

&lt;span class="c1"&gt;# Visualization&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ticker&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;

&lt;span class="c1"&gt;# Core ML &amp;amp; Audio Stack&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datasets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Audio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Features&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;load_from_disk&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;transformers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Wav2Vec2CTCTokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Wav2Vec2FeatureExtractor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Wav2Vec2Processor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Wav2Vec2ForCTC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TrainingArguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Trainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Project Utilities&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;asr_benchmark.config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DATA_ROOT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;asr_benchmark.score&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VALID_IPA_CHARS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score_ipa_cer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_colwidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;

&lt;span class="c1"&gt;# Force &amp;#39;auto&amp;#39; to use the standard console tqdm&lt;/span&gt;
&lt;span class="n"&gt;tqdm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tqdm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tqdm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;hr&gt;
&lt;h1 id="Step-1:-Load-and-explore-the-data"&gt;Step 1: Load and explore the data&lt;a class="anchor-link" href="#Step-1:-Load-and-explore-the-data"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;First, you'll likely want to set up your own repository for developing a solution. We recommend using &lt;a href="https://cookiecutter-data-science.drivendata.org/"&gt;Cookiecutter Data Science&lt;/a&gt;, which ensures an easy-to-navigate project structure.&lt;/p&gt;
&lt;p&gt;We'll download all of the competition data to our "raw" folder. There are two distinct training corpora that share the same structure but contain different data, and are hosted in separate locations for participant access. One corpus is hosted on the DrivenData platform, while a second corpus, which follows the same schema but contains different data, is provided by TalkBank. See the &lt;a href="https://www.drivendata.org/competitions/309/childrens-phonetic-asr/data/"&gt;Data Download&lt;/a&gt; page for access instructions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Our local data structure after downloading all files to a raw data folder is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;childrens-speech-recognition-benchmark-pub/data/raw
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;drivendata
&lt;span class="w"&gt;    &lt;/span&gt;│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio.zip
&lt;span class="w"&gt;    &lt;/span&gt;│&lt;span class="w"&gt;   &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;train_phon_transcripts.jsonl
&lt;span class="w"&gt;    &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;talkbank
&lt;span class="w"&gt;        &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio.zip
&lt;span class="w"&gt;        &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;train_phon_transcripts.jsonl
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;After unzipping the audio, we can start exploring the data!&lt;/p&gt;
&lt;p&gt;For each of the two corpora, the file &lt;code&gt;train_phon_transcripts.jsonl&lt;/code&gt; contains the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;utterance_id&lt;/code&gt; (str) - unique identifier for each utterance&lt;/li&gt;
&lt;li&gt;&lt;code&gt;child_id&lt;/code&gt; (str) - unique, anonymized identifier for the speaker&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session_id&lt;/code&gt; (str) - unique identifier for the recording session; a single child_id may be associated with multiple session_ids&lt;/li&gt;
&lt;li&gt;&lt;code&gt;audio_path&lt;/code&gt; (str) - path to the corresponding .flac audio file relative to the /audio directory, following the pattern audio/{utterance_id}.flac&lt;/li&gt;
&lt;li&gt;&lt;code&gt;audio_duration_sec&lt;/code&gt; (float) - duration of the audio clip in seconds&lt;/li&gt;
&lt;li&gt;&lt;code&gt;age_bucket&lt;/code&gt; (str) - age range of the child at the time of recording ("3-4", "5-7", "8-11", "12+", or "unknown")&lt;/li&gt;
&lt;li&gt;&lt;code&gt;md5_hash&lt;/code&gt; (str) - MD5 checksum of the audio file, used for integrity verification&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filesize_bytes&lt;/code&gt; (int) - size of the audio file in bytes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phonetic_text&lt;/code&gt; (str) - phonetic transcription of the utterance using the International Phonetic Alphabet (IPA)&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Each line in the JSONL manifest corresponds to a single utterance and references exactly one associated audio file. The &lt;code&gt;phonetic_text&lt;/code&gt; field contains a manually created, minimally normalized phonetic transcription that serves as the training label.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Let's-explore-the-metadata!"&gt;Let's explore the metadata!&lt;a class="anchor-link" href="#Let's-explore-the-metadata!"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We will load the JSONL transcripts and explore some of the metadata. As a starting point, it is helpful to know how many utterances we have, how many unique children are present, the total audio time, the distribution of audio clip durations, and the distribution of child ages.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;read_transcripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Read JSONL transcript file into a DataFrame and convert audio paths to absolute paths.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;transcript_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;train_phon_transcripts.jsonl&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcript_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Loaded &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; utterance transcripts&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_relpath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_relpath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df_dd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_transcripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;raw&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;drivendata&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df_tb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_transcripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;raw&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;talkbank&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;df_dd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;df_tb&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;ignore_index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stderr output_text"&gt;
&lt;pre&gt;&lt;span class="ansi-green-fg"&gt;2026-03-09 23:53:06.457&lt;/span&gt; | &lt;span class="ansi-bold"&gt;INFO    &lt;/span&gt; | &lt;span class="ansi-cyan-fg"&gt;__main__&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;read_transcripts&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;5&lt;/span&gt; - &lt;span class="ansi-bold"&gt;Loaded 12043 utterance transcripts&lt;/span&gt;
&lt;span class="ansi-green-fg"&gt;2026-03-09 23:53:07.659&lt;/span&gt; | &lt;span class="ansi-bold"&gt;INFO    &lt;/span&gt; | &lt;span class="ansi-cyan-fg"&gt;__main__&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;read_transcripts&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;5&lt;/span&gt; - &lt;span class="ansi-bold"&gt;Loaded 141024 utterance transcripts&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[4]:&lt;/div&gt;



&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;utterance_id&lt;/th&gt;
      &lt;th&gt;child_id&lt;/th&gt;
      &lt;th&gt;session_id&lt;/th&gt;
      &lt;th&gt;audio_duration_sec&lt;/th&gt;
      &lt;th&gt;age_bucket&lt;/th&gt;
      &lt;th&gt;md5_hash&lt;/th&gt;
      &lt;th&gt;filesize_bytes&lt;/th&gt;
      &lt;th&gt;phonetic_text&lt;/th&gt;
      &lt;th&gt;audio_relpath&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;td&gt;U_0004fcba47fc2b22&lt;/td&gt;
      &lt;td&gt;C_90db3102e2ca5699&lt;/td&gt;
      &lt;td&gt;S_419bdf9a10b462ab&lt;/td&gt;
      &lt;td&gt;1.435&lt;/td&gt;
      &lt;td&gt;3-4&lt;/td&gt;
      &lt;td&gt;5895195afa942429e393e5f9ada72e77&lt;/td&gt;
      &lt;td&gt;121365&lt;/td&gt;
      &lt;td&gt;ʔə ʔæpɫ&lt;/td&gt;
      &lt;td&gt;audio/U_0004fcba47fc2b22.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;td&gt;U_000727b46808376d&lt;/td&gt;
      &lt;td&gt;C_1c2507f6a16497c4&lt;/td&gt;
      &lt;td&gt;S_bae094ac403ace8c&lt;/td&gt;
      &lt;td&gt;1.430&lt;/td&gt;
      &lt;td&gt;5-7&lt;/td&gt;
      &lt;td&gt;4323bbdc2503cd0e63431a328243ac44&lt;/td&gt;
      &lt;td&gt;39763&lt;/td&gt;
      &lt;td&gt;hjuːdə&lt;/td&gt;
      &lt;td&gt;audio/U_000727b46808376d.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;td&gt;U_0012a1c1c3646a51&lt;/td&gt;
      &lt;td&gt;C_0efba146ed1d6bd1&lt;/td&gt;
      &lt;td&gt;S_80c5357ec852f45e&lt;/td&gt;
      &lt;td&gt;0.692&lt;/td&gt;
      &lt;td&gt;3-4&lt;/td&gt;
      &lt;td&gt;fb204762a593add9edf112321d3f5220&lt;/td&gt;
      &lt;td&gt;57768&lt;/td&gt;
      &lt;td&gt;ʔɛfɹi&lt;/td&gt;
      &lt;td&gt;audio/U_0012a1c1c3646a51.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;3&lt;/th&gt;
      &lt;td&gt;U_00142fc9f1318b66&lt;/td&gt;
      &lt;td&gt;C_d4df815189b10ac9&lt;/td&gt;
      &lt;td&gt;S_26c9e4507452cad3&lt;/td&gt;
      &lt;td&gt;1.685&lt;/td&gt;
      &lt;td&gt;3-4&lt;/td&gt;
      &lt;td&gt;20a33e749593a0471122d4671c5e9aca&lt;/td&gt;
      &lt;td&gt;111562&lt;/td&gt;
      &lt;td&gt;sɑnd tɔiz&lt;/td&gt;
      &lt;td&gt;audio/U_00142fc9f1318b66.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;4&lt;/th&gt;
      &lt;td&gt;U_00181407f98d6b68&lt;/td&gt;
      &lt;td&gt;C_63baf19fc3f58441&lt;/td&gt;
      &lt;td&gt;S_8f2a5a16e483fe0f&lt;/td&gt;
      &lt;td&gt;2.083&lt;/td&gt;
      &lt;td&gt;3-4&lt;/td&gt;
      &lt;td&gt;39828bb94a994b7a55790596ce870b16&lt;/td&gt;
      &lt;td&gt;175378&lt;/td&gt;
      &lt;td&gt;æn nʌɾɚ wʌn ɪn hɪɚ&lt;/td&gt;
      &lt;td&gt;audio/U_00181407f98d6b68.flac&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utterance_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nunique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[5]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;153067&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;child_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nunique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;1003&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;audio_duration_sec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[7]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;85&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;There are over 153,000 utterances in the training dataset, across 1,003 children, totaling 85 hours of audio data. Next, let's take a look at the distribution of audio clip durations.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inf&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;20+&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;binned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;audio_duration_sec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binned&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Audio Duration (sec)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Number of Audio Clips&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Distribution of Audio Durations&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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w9TUVJrz/fffIywsDN27d4eBgQEGDBiAFStWSONWVlbYu3cvQkND4eXlhQYNGmDmzJlq93Lq2LEjNm7ciPfffx8zZsxA48aNsX37djRv3vzZvBlERESk16r1Pk21Ce/TREREVPPUmPs0EREREdUUDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMRtXdAFWey7RdsudeXxBQhZ0QERHVXtzTRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREclQraFp9uzZUCgUakvTpk2l8YcPHyI0NBT169eHhYUFBgwYgPT0dLUaKSkpCAgIgLm5OWxsbDB58mQUFRWpzTl48CDatGkDpVIJNzc3REZGlunls88+g4uLC0xNTeHt7Y0TJ05UyWsmIiKimqna9zQ1a9YMt27dkpYjR45IY+Hh4fjll1+wZcsWHDp0CKmpqXj99del8eLiYgQEBKCgoADHjh3Dhg0bEBkZiZkzZ0pzkpOTERAQgG7duiEhIQETJ05ESEgI9uzZI82JiopCREQEZs2ahdOnT6NVq1bw9/dHRkbGs3kTiIiISO9Ve2gyMjKCnZ2dtDRo0AAAkJ2djXXr1mHJkiV4+eWX4eXlhfXr1+PYsWM4fvw4AGDv3r24ePEivvvuO3h6eqJXr1748MMP8dlnn6GgoAAAsGbNGri6umLx4sVwd3dHWFgYBg4ciKVLl0o9LFmyBKNGjcKIESPg4eGBNWvWwNzcHF9//fWzf0OIiIhIL1V7aLpy5QocHBzwwgsvYMiQIUhJSQEAxMfHo7CwEH5+ftLcpk2b4vnnn0dsbCwAIDY2Fi1atICtra00x9/fHzk5Obhw4YI059Ea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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Most audio clips are very short (1-3 seconds). Even though the audio has been clipped to the utterance level, we have some outliers over 20 seconds. Next, let's look at the distribution of utterances by child age.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;age_bucket&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Categorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;age_bucket&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;unknown&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;3-4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;5-7&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;8-11&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;12+&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;ordered&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;age_bucket&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normalize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;barh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Utterances by Age Group&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Percent of Utterances&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Age Group&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PercentFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.0f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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iEgeLl++jKZNm1brezLQvYL09fUBPPlCGBgY1HA1REREVB7Z2dmwsLCQfo5XJwa6V1DRaVYDAwMGOiIiIpmpiculeFMEERERkcwx0BERERHJHAMdERERkcwx0BERERHJHAMdERERkcwx0BERERHJHAMdERERkcwx0BERERHJHAMdERERkcwx0BERERHJHAMdERERkcwx0BERERHJHAMdERERkcwx0BERERHJHAMdERERkcwx0BERERHJnEZNF0ClazMjBmrKejVdBlGtd2GeV02XQET0UjhDR0RERCRzDHREREREMsdAR0RERCRzDHREREREMsdAR0RERCRzDHREREREMsdAR0RERCRzDHREREREMsdAR0RERCRzDHREREREMsdAR0RERCRzDHRERP/f3r174e3tDXNzcygUCkRFRamsz83NxZgxY9C0aVPo6OjA3t4ey5cvV+kzfvx4GBsbw8LCAhERESrr1q9fD29v76oeBhHVQRo1XQAR0avi3r17cHJywvDhw/HWW28VWz9+/Hjs2rULq1evhrW1NbZv345PPvkE5ubm6N+/PzZv3ow1a9Zg+/btOHv2LIYPHw5PT0+YmJggKysLU6ZMwY4dO2pgZERU23GGDmX/qzw/Px+TJk1C27ZtoaurC3Nzc/j6+uLatWs1VzARVYm+ffvi66+/xqBBg0pcv3//fvj5+cHd3R3W1tYYOXIknJyccPjwYQBAamoq3N3d0bFjRwwePBgGBgZIT08HAHz55ZcICAiApaVltY2HiOoOBjr837/Kf/zxx2Lr7t+/j6NHj2LatGk4evQoNm7ciLS0NPTv37/U/V24cAEKhaIqSyaiGtClSxdER0fj6tWrEEJg9+7dOHPmDN544w0AgJOTExISEnD37l0kJibiwYMHsLGxQXx8PI4ePYqxY8fW8AiIqLbiKVc8+Vd53759S1xnaGiI2NhYlbalS5eiU6dOuHTpEv+1TVSHhISEYOTIkWjatCk0NDSgpqaGn3/+Gd27dwcAeHp64oMPPoCzszN0dHQQHh4OXV1dBAQEICwsDMuWLUNISAhMTEywcuVKODg41PCIiKi2YKB7AVlZWVAoFDAyMqqU/eXl5SEvL09azs7OrpT9ElHlCgkJwcGDBxEdHQ0rKyvs3bsXgYGBMDc3h4eHBwAgODgYwcHB0jYzZ86Eh4cHNDU18fXX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IyIiIpI5BjoiIiIimWOgIyIiIpI5BjoiIiIimWOgIyIiIpI5BjoiIiIimWOgIyIiIpI5BjoiIiIimdOo6QKodCdmelb774IjIiIi+eEMHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyRwDHREREZHMMdARERERyZzGi2yUlpaGkJAQpKamAgBat26NTz/9FHZ2dpVaHBERERE9X4Vn6DZs2IA2bdogMTERTk5OcHJywtGjR9GmTRts2LChKmokIiIiojIohBCiIhu0aNECQ4cOxaxZs1TaZ8yYgdWrV+P8+fOVWmBdlJ2dDUNDQ2RlZcHAwKCmyyEiIqJyqMmf3xWeocvIyICvr2+x9g8++AAZGRmVUhQRERERlV+FA527uzv++eefYu3x8fHo1q1bpRRFREREROVX4Zsi+vfvj0mTJiExMRGdO3cGABw8eBDr16/HzJkzER0drdKXiIiIiKpWha+hU1Mr36SeQqFAQUHBCxVV1/EaOiIiIvmpyZ/fFZ6hKywsrIo6iIiIiOgF8cHCRERERDJX4Rm6Zx9X8qzp06e/cDFEREREVHEVDnSbNm1SWc7Pz0d6ejo0NDTQokULBjoiIiKialbhQHfs2LFibdnZ2fD398egQYMqpSgiIiIiKr9KuYbOwMAAM2fOxLRp0ypjd0RERERUAZV2U0RWVhaysrIqa3dEREREVE4VPuX6ww8/qCwLIZCRkYHffvsNffv2rbTCiIiIiKh8KhzovvvuO5VlNTU1mJqaws/PD0FBQZVWGBERERGVT4UDXXp6elXUQSVoMyMGasp6NV0GUY27MM+rpksgInqlvdQ1dFeuXMGVK1cqqxYiIiIiegEVDnSFhYWYNWsWDA0NYWVlBSsrKxgZGWH27Nn8tWBERERENaDCp1ynTJmCVatWYd68eXBzcwMAxMfHIzg4GA8fPsScOXMqvUgiIiIiKl2FA114eDh++eUX9O/fX2pzdHREkyZN8MknnzDQEREREVWzCp9yvXPnDlq1alWsvVWrVrhz506lFEVERERE5VfhQOfk5ISlS5cWa1+6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mWOgIyIiIpK5Fw50jx49QlpaGh4/flyZ9RARERFRBVU40N2/fx8fffQR6tWrBwcHB+l3JH766aeYN29epRdIRERERGWrcKALCgpCcnIy4uLioK2tLbV7eHhg7dq1lVocERERET1fuR8sXCQqKgpr165F586doVAopHYHBwecP3++UosjIiIiouer8AzdrVu3Svwdpvfu3VMJeERERERUPSoc6Dp27IitW7dKy0Uh7pdffoGrq2vlVUZERERE5VLhU67ffPMN+vbti1OnTuHx48dYsmQJTp06hf3792PPnj1VUSMRERERleGFfpfr+fPnMW/ePCQnJyM3Nxft27fHpEmT0LZt26qosc6pyd8FR0RERC+mJn9+v1Cgo6rFQEdERCQ/Nfnzu8KnXLOzs0tsVygUUCqV0NLSeumiiIiIiKj8KhzojIyMyrybtWnTpvD398eMGTOgpsbfLEZERERU1Soc6MLCwjBlyhT4+/ujU6dOAIDDhw8jPDwcU6dOxa1bt7Bw4UIolUp89dVXlV4wEREREamqcKALDw/HokWL4OPjI7V5e3ujbdu2WLFiBXbu3AlLS0vMmTOHgY6IiIioGlT4nOj+/fvRrl27Yu3t2rXDgQMHAABdu3aVfscrEREREVWtCgc6CwsLrFq1qlj7qlWrYGFhAQC4ffs26tev//LVEREREdFzVfiU68KFC/Huu+9i27ZtcHZ2BgAkJCTg9OnT+OOPPwAAR44cwXvvvVe5lRIRERFRiV7oOXQXLlzAihUrkJaWBgCws7PDqFGjYG1tXdn11Ul8Dh0REZH81JoHC584cQJt2rSprN3VWQx0RERE8lOTP79f+kFxOTk5WLlyJTp16gQnJ6fKqImIiIiIKuCFA93evXvh5+eHxo0bY+HChejZsycOHjxYmbURERERUTlU6KaI69evIywsDKtWrUJ2djZ8fHyQl5eHqKgo2NvbV1WNRERERFSGcs/QeXt7w87ODsePH8f333+Pa9euISQkpCprIyIiIqJyKPcM3bZt2zB27FgEBASgZcuWVVkTEREREVVAuWfo4uPjkZOTgw4dOsDFxQVLly7Ff//9V5W1EREREVE5lDvQde7cGT///DMyMjIwatQoREZGwtzcHIWFhYiNjUVOTk5V1klEREREpXip59ClpaVh1apV+O2335CZmYnevXsjOjq6Muurk/gc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EREREckcAx0RERGRzDHQEREREckcAx0RERGRzDHQEREREckcAx0RERGRzDHQEREREckcAx0RERGRzDHQEREREckcAx0RERGRzDHQEREREckcAx0RERGRzDHQEREREckcAx0RERGRzDHQEREREckcAx0RERGRzDHQEREREckcAx0RERGRzGnUdAFUujYzYqCmrFfTZZTbhXleNV0CERFRncQZOiIiIiKZY6AjIiIikjkGOiIiIiKZY6AjIiIikjkGOiIiIiKZY6AjIiIikjkGOiIiIiKZY6AjIiIikjkGOiIiIiKZY6AjIiIikjkGOiIiIiKZY6AjIiIikjlZB7q4uDgoFApkZmbWdClUinnz5kGhUGDcuHFS2/jx42FsbAwLCwtERESo9F+/fj28vb2ruUoiIiJ506jpAqj2OnLkCFasWAFHR0epbfPmzVizZg22b9+Os2fPYvjw4fD09ISJiQmysrIwZcoU7NixowarJiIikh9Zz9DRqys3NxdDhw7Fzz//jPr160vtqampcHd3R8eOHTF48GAYGBggPT0dAPDll18iICAAlpaWNVU2ERGRLNVooLO2tsb333+v0vbaa68hODgYAKBQKPDLL79g0KBBqFevHlq2bIno6OhS93f//n307dsXbm5uyMzMxIULF6BQKLBx40a8/vrrqFevHpycnHDgwAGV7TZs2AAHBwcolUpYW1tj0aJF0rqlS5eiTZs20nJUVBQUCgWWL18utXl4eGDq1KkAgODgYLz22mv47bffYG1tDUNDQ7z//vvIycl50Y9JlgIDA+Hl5QUPDw+VdicnJyQkJODu3btITEzEgwcPYGNjg/j4eBw9ehRjx46toYqJiIjk65WfoZs5cyZ8fHxw/Phx9OvXD0OHDsWdO3eK9cvMzETv3r1RWFiI2NhYGBkZSeumTJmCiRMnIikpCba2thg8eDAeP34MAEhMTISPjw/ef/99pKSkIDg4GNOmTUNYWBgAoEePHjh16hRu3boFANizZw9MTEwQFxcHAMjPz8eBAwfg7u4uvd/58+cRFRWFLVu2YMuWLdizZw/mzZtXJZ/PqygyMhJHjx7F3Llzi63z9PTEBx98AGdnZ/j7+yM8PBy6uroICAjA8uXLsWzZMtjZ2cHNzQ0nT56sgeqJiIjk55UPdP7+/hg8eDBsbGzwzTffIDc3F4cPH1bpc/36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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;All age buckets are well represented:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;24% of the utterances come from 3 to 4 year olds&lt;/li&gt;
&lt;li&gt;16% of the utterances come from 5 to 7 year olds&lt;/li&gt;
&lt;li&gt;38% of the utterances come from 8 to 11 year olds&lt;/li&gt;
&lt;li&gt;18% of the utterances come from 12 year olds and older&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Let's-explore-the-utterances!"&gt;Let's explore the utterances!&lt;a class="anchor-link" href="#Let's-explore-the-utterances!"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We will listen to an example utterance and explore its phonetic transcription.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;audio controls src="../audio/gates_asr_U_1c8757065e355c35.flac"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Children’s speech often includes subtle pronunciation differences when compared to adult speech. In the Phonetic Track, models must learn to map pronunciations that vary by age, development, and region to target labels that reflect the phones each child actually produced.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utterance_id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;U_1c8757065e355c35&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utterance_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;audio_duration_sec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;phonetic_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[10]:&lt;/div&gt;



&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;utterance_id&lt;/th&gt;
      &lt;th&gt;audio_duration_sec&lt;/th&gt;
      &lt;th&gt;phonetic_text&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;27819&lt;/th&gt;
      &lt;td&gt;U_1c8757065e355c35&lt;/td&gt;
      &lt;td&gt;0.516&lt;/td&gt;
      &lt;td&gt;jæ&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The ground truth &lt;code&gt;phonetic_text&lt;/code&gt; labels are normalized phonetic transcriptions of individual utterances using the &lt;a href="https://en.wikipedia.org/wiki/International_Phonetic_Alphabet"&gt;International Phonetic Alphabet (IPA)&lt;/a&gt;, with a one-to-one mapping between Unicode characters and phones. Each transcription captures the full sequence of speech sounds in the corresponding audio clip and may include substitutions, omissions, or non-standard productions that are typically ignored in word-level ASR.&lt;/p&gt;
&lt;p&gt;All phonetic labels are restricted to the predefined IPA character set used during phonetic transcription. This set is provided in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/blob/main/metric/score.py"&gt;scoring script&lt;/a&gt; in the runtime repository for local validation of predictions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;hr&gt;
&lt;h1 id="Step-2:-Build-the-Model"&gt;Step 2: Build the Model&lt;a class="anchor-link" href="#Step-2:-Build-the-Model"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;A straightforward modeling option is to start from a strong pretrained ASR model, then fine-tune on our labeled phonetic child-speech training set. In this tutorial, we fine-tune Facebook's pretrained Wav2Vec2-base model using Hugging Face Transformers.&lt;/p&gt;
&lt;p&gt;Wav2Vec2 is relatively simple and efficient to fine-tune, making it a reasonable starting point for this challenge. It uses a &lt;a href="https://en.wikipedia.org/wiki/Convolutional_neural_network"&gt;convolutional neural network&lt;/a&gt; ("CNN") feature extractor followed by a transformer encoder to learn audio representations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A CNN is a neural network that learns useful features from data by applying small pattern detectors called filters. These filters scan across the input (such as an image or audio signal) and learn to recognize important patterns.&lt;/li&gt;
&lt;li&gt;Wav2Vec2 is pretrained on unlabeled speech audio and later fine-tuned for ASR using a defined output vocabulary, typically consisting of characters. For this challenge, we instead define a vocabulary of IPA phone symbols, mapping each phonetic symbol to a unique integer ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;We will freeze the feature extractor to preserve the robust pre-trained audio processing capabilities, then fine-tune the transformer encoder and a newly initialized CTC head configured for our phonetic character vocabulary.&lt;/strong&gt; Hugging Face makes this process easier by providing model architectures, data processing utilities (tokenizers, feature extractors, data collators), and integrated training pipelines.&lt;/p&gt;
&lt;p&gt;Key packages include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;transformers&lt;/code&gt; for Wav2Vec2 model + training utilities&lt;/li&gt;
&lt;li&gt;&lt;code&gt;datasets&lt;/code&gt; for data loading and preprocessing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;torch&lt;/code&gt; for the training backend&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="1.-Prepare-Dataset"&gt;1. Prepare Dataset&lt;a class="anchor-link" href="#1.-Prepare-Dataset"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We need to process our dataframe containing the DrivenData and TalkBank datasets. We filter out clips longer than 25 seconds, which strain computer memory. Competitors may want to further split these clips to avoid losing training data. We remove one corrupted file before limiting the data to just the phonetic transcription and the audio filepath.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Filter down to audio less than 25 seconds to reduce strain on memory&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;audio_duration_sec&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# Filter out corrupted file&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utterance_id&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;U_b8a4e8220e65219b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# For now, we only need the transcript and the audio path&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;phonetic_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We then create a Hugging Face Dataset from our dataframe, which gives us a standard format that works cleanly with dataset transforms and the training pipeline. We also cast the audio column to 16 kHz so clips are decoded and resampled to the sampling rate expected by Wav2Vec2.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Audio sampling rate&lt;/span&gt;
&lt;span class="n"&gt;SR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16000&lt;/span&gt;

&lt;span class="c1"&gt;# Enforce string types so that datasets can consume them properly&lt;/span&gt;
&lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Features&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;phonetic_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pandas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SR&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="2.-Build-Vocabulary-and-Tokenizer"&gt;2. Build Vocabulary and Tokenizer&lt;a class="anchor-link" href="#2.-Build-Vocabulary-and-Tokenizer"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Our model treats each IPA character as one token, so it is important that every valid character has a consistent ID. To create a character to ID mapping, we take the imported &lt;code&gt;VALID_IPA_CHARS&lt;/code&gt; from the scoring script and map each IPA character to an index for the tokenizer.&lt;/p&gt;
&lt;p&gt;Special tokens are added to the set of IPA characters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt; replaces spaces as the word delimiter&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[UNK]&lt;/code&gt; is a fallback token that maps any character not in VALID_IPA_CHARS to a single token ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[PAD]&lt;/code&gt; is the padding token used to pad sequences to equal length in batches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This mapping is saved so we can reuse the same token IDs when we initialize the tokenizer now and when we load the model for inference later.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[13]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# VALID_IPA_CHARS contains the following IPA characters:&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;VALID_IPA_CHARS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;æ o b c ɑ   ʔ ɛ s j ɹ f ʊ ə ʁ i ɔ v ɟ x ʌ ŋ χ d h ʝ k n l ɐ ʤ ɪ ɚ ç z ː m t ɫ ʃ ʧ w r p ɾ ɬ ʒ θ u g ð e
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[14]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;unk_tok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;[UNK]&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;pad_tok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;[PAD]&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;space_tok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;|&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;all_toks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;VALID_IPA_CHARS&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;unk_tok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pad_tok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;space_tok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;vocab_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_toks&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

&lt;span class="n"&gt;vocab_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DATA_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;vocab/phonetic_vocab.json&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;vocab_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;vocab_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Next, we initialize a tokenizer to convert text labels to token IDs. The tokenizer reads the vocabulary mapping we just saved, so each IPA character and special token uses the same ID during training and inference. We also initialize the feature extractor, which converts raw 16 kHz waveforms into model-ready input values for Wav2Vec2.&lt;/p&gt;
&lt;p&gt;Finally, the &lt;code&gt;Wav2Vec2Processor&lt;/code&gt; is initialized. The processor combines the feature extractor and tokenizer in one object, so we can consistently preprocess audio and encode/decode labels.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[15]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Wav2Vec2CTCTokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_path&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;unk_token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unk_tok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad_token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pad_tok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word_delimiter_token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;space_tok&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create Wav2Vec2 Feature Extractor&lt;/span&gt;
&lt;span class="n"&gt;feature_extractor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Wav2Vec2FeatureExtractor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;feature_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;padding_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;do_normalize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;return_attention_mask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create processor (combines tokenizer and feature extractor)&lt;/span&gt;
&lt;span class="n"&gt;processor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Wav2Vec2Processor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_extractor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;feature_extractor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="3.-Create-Data-Collator"&gt;3. Create Data Collator&lt;a class="anchor-link" href="#3.-Create-Data-Collator"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Data collators prepare training batches from variable-length sequences. In our model, since audio clips have different lengths, the data collator adds padding to shorter clips so all clips in a batch have the same length. It marks padded positions in the labels with -100, which tells the training algorithm to ignore those positions when calculating loss.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[16]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;DataCollatorCTCWithPadding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    Data collator that will dynamically pad the inputs received.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Wav2Vec2Processor&lt;/span&gt;
    &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;max_length_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;pad_to_multiple_of&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;pad_to_multiple_of_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="p"&gt;]]]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;input_features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;input_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;input_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;label_features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;input_ids&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;input_features&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;pad_to_multiple_of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad_to_multiple_of&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;labels_batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;label_features&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_length_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;pad_to_multiple_of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad_to_multiple_of_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# replace padding with -100 to ignore loss correctly&lt;/span&gt;
        &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;labels_batch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;input_ids&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;masked_fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;labels_batch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attention_mask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;


&lt;span class="c1"&gt;# Initialize data collator&lt;/span&gt;
&lt;span class="n"&gt;data_collator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DataCollatorCTCWithPadding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="4.-Preprocess-Audio"&gt;4. Preprocess Audio&lt;a class="anchor-link" href="#4.-Preprocess-Audio"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We define a preprocessing function that extracts features and tokenizes the phonetic text labels using the &lt;code&gt;Wav2Vec2Processor&lt;/code&gt; object we already created. The function replaces spaces with word delimiters before tokenization to prepare labels for training.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[17]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;preprocess_batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Start by loading the audio and processing with the feature extractor&lt;/span&gt;
    &lt;span class="n"&gt;processed_batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;input_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;array&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Replace spaces with word delimiter and tokenize for CTC&lt;/span&gt;
    &lt;span class="n"&gt;processed_batch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;|&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;phonetic_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;processed_batch&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We apply this preprocessing across the dataset in parallel and save the results to disk for faster development iteration.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[18]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;PROCESSED_DATASET_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DATA_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;processed&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;phonetic_dataset&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;PROCESSED_DATASET_DIR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;processed_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_from_disk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROCESSED_DATASET_DIR&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Loaded preprocessed dataset from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PROCESSED_DATASET_DIR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relative_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processed_dataset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; examples)&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;processed_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preprocess_batch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batched&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_proc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;processed_dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_to_disk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROCESSED_DATASET_DIR&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Preprocessed and saved dataset to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PROCESSED_DATASET_DIR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relative_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;





 
 
&lt;div id="f65ef4f3-99f0-4eef-a6f9-e69601f0e147"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_widget_view "&gt;
&lt;script type="text/javascript"&gt;
var element = $('#f65ef4f3-99f0-4eef-a6f9-e69601f0e147');
&lt;/script&gt;
&lt;script type="application/vnd.jupyter.widget-view+json"&gt;
{"model_id": "fc60459a179b494faad51aaf440b9314", "version_major": 2, "version_minor": 0}
&lt;/script&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;





 
 
&lt;div id="6b40e33c-4c1b-46dc-ad3a-0e104252acd9"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_widget_view "&gt;
&lt;script type="text/javascript"&gt;
var element = $('#6b40e33c-4c1b-46dc-ad3a-0e104252acd9');
&lt;/script&gt;
&lt;script type="application/vnd.jupyter.widget-view+json"&gt;
{"model_id": "de4b00eba3014bf3b5f29e12fc79f288", "version_major": 2, "version_minor": 0}
&lt;/script&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Preprocessed and saved dataset to data/processed/phonetic_dataset
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="5.-Model-Configuration-and-Training-Setup"&gt;5. Model Configuration and Training Setup&lt;a class="anchor-link" href="#5.-Model-Configuration-and-Training-Setup"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We load the pretrained Wav2Vec2-base model with a CTC architecture and initialize a new CTC head configured for our phonetic vocabulary. CTC enables direct audio-to-phone prediction without requiring explicit alignment between audio frames and individual characters. This simplifies our setup because we don't have to label exactly when each phone occurs in the audio, rather we just have to specify the sequence of phones.&lt;/p&gt;
&lt;p&gt;The feature extractor is frozen to preserve audio processing learned from the model pretraining; we lock those weights and don't update them during training. We will only fine-tune the transformer encoder (which learns acoustic patterns) and the CTC head (which converts these patterns into phone predictions).&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[19]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Load pretrained Wav2Vec2 model&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Wav2Vec2ForCTC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;facebook/wav2vec2-base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ctc_loss_reduction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mean&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ctc_zero_infinity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Replace inf CTC loss with 0 to prevent NaN gradients&lt;/span&gt;
    &lt;span class="n"&gt;pad_token_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad_token_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ignore_mismatched_sizes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Freeze feature extractor layers&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;freeze_feature_encoder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stderr output_text"&gt;
&lt;pre&gt;/.venv/lib/python3.11/site-packages/transformers/configuration_utils.py:309: UserWarning: Passing `gradient_checkpointing` to a config initialization is deprecated and will be removed in v5 Transformers. Using `model.gradient_checkpointing_enable()` instead, or if you are using the `Trainer` API, pass `gradient_checkpointing=True` in your `TrainingArguments`.
  warnings.warn(
Some weights of Wav2Vec2ForCTC were not initialized from the model checkpoint at facebook/wav2vec2-base and are newly initialized: [&amp;#39;lm_head.bias&amp;#39;, &amp;#39;lm_head.weight&amp;#39;]
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We then filter out a few utterances that violate CTC's length constraints. This violation occurred because, for some utterances, there were too many tokens for the audio time. Wav2Vec2 downsamples audio by 320x, so the output sequence length must exceed the label length to avoid infinite loss values.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[20]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Filter out samples that violate the CTC constraint:&lt;/span&gt;
&lt;span class="c1"&gt;# Wav2Vec2 downsamples audio by 320x, so input_length // 320 must be &amp;gt; label_length.&lt;/span&gt;
&lt;span class="c1"&gt;# Samples violating this produce inf CTC loss -&amp;gt; NaN gradients.&lt;/span&gt;
&lt;span class="n"&gt;WAV2VEC2_DOWNSAMPLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;
&lt;span class="n"&gt;before_filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processed_dataset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;is_valid_ctc_sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;input_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;input_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;label_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;# CTC requires: output_timesteps &amp;gt; label_length (including blanks)&lt;/span&gt;
    &lt;span class="n"&gt;output_timesteps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input_len&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;WAV2VEC2_DOWNSAMPLE&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;output_timesteps&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;label_len&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;label_len&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;input_len&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;


&lt;span class="n"&gt;processed_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processed_dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_valid_ctc_sample&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_proc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CTC filter: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;before_filter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processed_dataset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; samples (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;before_filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processed_dataset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; removed)&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;





 
 
&lt;div id="51a0625a-def5-488c-a42d-c7653bfbf209"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_widget_view "&gt;
&lt;script type="text/javascript"&gt;
var element = $('#51a0625a-def5-488c-a42d-c7653bfbf209');
&lt;/script&gt;
&lt;script type="application/vnd.jupyter.widget-view+json"&gt;
{"model_id": "9f8b3739e9bc4d55893f61001d43bdb1", "version_major": 2, "version_minor": 0}
&lt;/script&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;CTC filter: 152997 -&amp;gt; 152989 samples (8 removed)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The Trainer expects separate training and validation datasets, so we can simply split our &lt;code&gt;processed_dataset&lt;/code&gt; such that 90% goes to training and 10% goes to validation.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[21]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Split dataset into train and validation&lt;/span&gt;
&lt;span class="n"&gt;dataset_split&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processed_dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shuffle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;train_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset_split&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;train&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;eval_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset_split&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;While the loss function drives the actual training and weight updates, the final metric upon which model inferences will be evaluated is Character Error Rate ("CER"). CER measures the edit distance between predicted and reference phonetic sequences at the character level. In training, whenever we compute validation loss, we also calculate the CER so that we can monitor training progress on a human-interpretable metric and select the best model checkpoint.&lt;/p&gt;
&lt;p&gt;To compute CER, we run the model on the validation dataset to generate phone predictions, then compare them to the ground truth labels. The &lt;code&gt;score_ipa_cer&lt;/code&gt; function is taken directly from the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/blob/main/metric/score.py"&gt;runtime repository&lt;/a&gt;. Please note that the &lt;code&gt;score_ipa_cer&lt;/code&gt; function normalizes the prediction and reference text before computing the CER.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[22]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;compute_metrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Compute Character Error Rate (CER) for phonetic transcription.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;pred_logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predictions&lt;/span&gt;
    &lt;span class="n"&gt;pred_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred_logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Replace -100 with pad_token_id for decoding&lt;/span&gt;
    &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label_ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label_ids&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad_token_id&lt;/span&gt;

    &lt;span class="c1"&gt;# Decode predictions and labels&lt;/span&gt;
    &lt;span class="n"&gt;pred_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;batch_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Don&amp;#39;t group tokens when computing metrics (important for CTC)&lt;/span&gt;
    &lt;span class="n"&gt;label_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;batch_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;group_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;score_ipa_cer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred_str&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Finally, the training hyperparameters are configured with reasonable starting points, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;learning rate of 5e-5&lt;/li&gt;
&lt;li&gt;batch size of 27 with gradient accumulation&lt;/li&gt;
&lt;li&gt;20 epochs with a linear warmup and decay learning rate schedule&lt;/li&gt;
&lt;li&gt;evaluation every 1000 steps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Hugging Face Trainer handles the training loop, checkpointing, and evaluation.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[23]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Define training arguments&lt;/span&gt;
&lt;span class="n"&gt;output_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;models&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;wav2vec2-phonetic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;training_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrainingArguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;output_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;output_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;group_by_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;per_device_train_batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;per_device_eval_batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;gradient_accumulation_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_grad_norm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5e-5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;num_train_epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;weight_decay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;eval_strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;steps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;eval_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;save_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logging_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;warmup_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Shorter warmup for fewer epochs&lt;/span&gt;
    &lt;span class="n"&gt;lr_scheduler_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;linear&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bf16&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fp16&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;gradient_checkpointing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dataloader_num_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dataloader_pin_memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;save_total_limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;metric_for_best_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;greater_is_better&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;load_best_model_at_end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;report_to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize trainer&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Trainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data_collator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data_collator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;training_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;compute_metrics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;compute_metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;train_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;train_dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;eval_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;eval_dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;processing_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="6.-Train-the-Model"&gt;6. Train the Model&lt;a class="anchor-link" href="#6.-Train-the-Model"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Let's fine-tune the pre-trained model to predict phones from child speech!&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[24]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stderr output_text"&gt;
&lt;pre&gt;/.venv/lib/python3.11/site-packages/torch/utils/checkpoint.py:232: UserWarning: None of the inputs have requires_grad=True. Gradients will be None
  check_backward_validity(args)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;



&lt;div class="output_html rendered_html output_subarea "&gt;

    &lt;div&gt;
      
      &lt;progress value='51000' max='51000' style='width:300px; height:20px; vertical-align: middle;'&gt;&lt;/progress&gt;
      [51000/51000 5:31:03, Epoch 20/20]
    &lt;/div&gt;
    &lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
 &lt;tr style="text-align: left;"&gt;
      &lt;th&gt;Step&lt;/th&gt;
      &lt;th&gt;Training Loss&lt;/th&gt;
      &lt;th&gt;Validation Loss&lt;/th&gt;
      &lt;th&gt;Cer&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1000&lt;/td&gt;
      &lt;td&gt;2.737000&lt;/td&gt;
      &lt;td&gt;2.372736&lt;/td&gt;
      &lt;td&gt;0.804864&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2000&lt;/td&gt;
      &lt;td&gt;1.511900&lt;/td&gt;
      &lt;td&gt;1.412020&lt;/td&gt;
      &lt;td&gt;0.437561&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3000&lt;/td&gt;
      &lt;td&gt;1.329400&lt;/td&gt;
      &lt;td&gt;1.259690&lt;/td&gt;
      &lt;td&gt;0.411161&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4000&lt;/td&gt;
      &lt;td&gt;1.217900&lt;/td&gt;
      &lt;td&gt;1.158037&lt;/td&gt;
      &lt;td&gt;0.405470&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5000&lt;/td&gt;
      &lt;td&gt;1.177500&lt;/td&gt;
      &lt;td&gt;1.124078&lt;/td&gt;
      &lt;td&gt;0.385218&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6000&lt;/td&gt;
      &lt;td&gt;1.097700&lt;/td&gt;
      &lt;td&gt;1.099532&lt;/td&gt;
      &lt;td&gt;0.380330&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7000&lt;/td&gt;
      &lt;td&gt;1.069700&lt;/td&gt;
      &lt;td&gt;1.064977&lt;/td&gt;
      &lt;td&gt;0.374003&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;8000&lt;/td&gt;
      &lt;td&gt;1.022000&lt;/td&gt;
      &lt;td&gt;1.048235&lt;/td&gt;
      &lt;td&gt;0.368162&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;9000&lt;/td&gt;
      &lt;td&gt;0.995600&lt;/td&gt;
      &lt;td&gt;1.019231&lt;/td&gt;
      &lt;td&gt;0.369283&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10000&lt;/td&gt;
      &lt;td&gt;1.001500&lt;/td&gt;
      &lt;td&gt;1.003653&lt;/td&gt;
      &lt;td&gt;0.362655&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;11000&lt;/td&gt;
      &lt;td&gt;0.951600&lt;/td&gt;
      &lt;td&gt;1.001552&lt;/td&gt;
      &lt;td&gt;0.361395&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;12000&lt;/td&gt;
      &lt;td&gt;0.947500&lt;/td&gt;
      &lt;td&gt;0.978547&lt;/td&gt;
      &lt;td&gt;0.357539&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;13000&lt;/td&gt;
      &lt;td&gt;0.891000&lt;/td&gt;
      &lt;td&gt;0.972168&lt;/td&gt;
      &lt;td&gt;0.356887&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;14000&lt;/td&gt;
      &lt;td&gt;0.902900&lt;/td&gt;
      &lt;td&gt;0.972453&lt;/td&gt;
      &lt;td&gt;0.354248&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;15000&lt;/td&gt;
      &lt;td&gt;0.865300&lt;/td&gt;
      &lt;td&gt;0.975841&lt;/td&gt;
      &lt;td&gt;0.353684&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;16000&lt;/td&gt;
      &lt;td&gt;0.842200&lt;/td&gt;
      &lt;td&gt;0.970502&lt;/td&gt;
      &lt;td&gt;0.351386&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;17000&lt;/td&gt;
      &lt;td&gt;0.845300&lt;/td&gt;
      &lt;td&gt;0.938102&lt;/td&gt;
      &lt;td&gt;0.350180&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;18000&lt;/td&gt;
      &lt;td&gt;0.807200&lt;/td&gt;
      &lt;td&gt;0.918144&lt;/td&gt;
      &lt;td&gt;0.346744&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;19000&lt;/td&gt;
      &lt;td&gt;0.815000&lt;/td&gt;
      &lt;td&gt;0.922606&lt;/td&gt;
      &lt;td&gt;0.348579&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;20000&lt;/td&gt;
      &lt;td&gt;0.822800&lt;/td&gt;
      &lt;td&gt;0.914684&lt;/td&gt;
      &lt;td&gt;0.344350&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;21000&lt;/td&gt;
      &lt;td&gt;0.772600&lt;/td&gt;
      &lt;td&gt;0.922295&lt;/td&gt;
      &lt;td&gt;0.344311&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;22000&lt;/td&gt;
      &lt;td&gt;0.789100&lt;/td&gt;
      &lt;td&gt;0.913038&lt;/td&gt;
      &lt;td&gt;0.344261&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;23000&lt;/td&gt;
      &lt;td&gt;0.772700&lt;/td&gt;
      &lt;td&gt;0.913228&lt;/td&gt;
      &lt;td&gt;0.340529&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;24000&lt;/td&gt;
      &lt;td&gt;0.731100&lt;/td&gt;
      &lt;td&gt;0.916719&lt;/td&gt;
      &lt;td&gt;0.341589&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;25000&lt;/td&gt;
      &lt;td&gt;0.730100&lt;/td&gt;
      &lt;td&gt;0.891391&lt;/td&gt;
      &lt;td&gt;0.340897&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;26000&lt;/td&gt;
      &lt;td&gt;0.719800&lt;/td&gt;
      &lt;td&gt;0.907422&lt;/td&gt;
      &lt;td&gt;0.339106&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;27000&lt;/td&gt;
      &lt;td&gt;0.710800&lt;/td&gt;
      &lt;td&gt;0.889043&lt;/td&gt;
      &lt;td&gt;0.338860&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;28000&lt;/td&gt;
      &lt;td&gt;0.714000&lt;/td&gt;
      &lt;td&gt;0.894029&lt;/td&gt;
      &lt;td&gt;0.337538&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;29000&lt;/td&gt;
      &lt;td&gt;0.681100&lt;/td&gt;
      &lt;td&gt;0.899334&lt;/td&gt;
      &lt;td&gt;0.336400&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;30000&lt;/td&gt;
      &lt;td&gt;0.680500&lt;/td&gt;
      &lt;td&gt;0.898606&lt;/td&gt;
      &lt;td&gt;0.336394&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;31000&lt;/td&gt;
      &lt;td&gt;0.669900&lt;/td&gt;
      &lt;td&gt;0.906611&lt;/td&gt;
      &lt;td&gt;0.335474&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;32000&lt;/td&gt;
      &lt;td&gt;0.653300&lt;/td&gt;
      &lt;td&gt;0.897395&lt;/td&gt;
      &lt;td&gt;0.336311&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;33000&lt;/td&gt;
      &lt;td&gt;0.652500&lt;/td&gt;
      &lt;td&gt;0.891148&lt;/td&gt;
      &lt;td&gt;0.333599&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;34000&lt;/td&gt;
      &lt;td&gt;0.630100&lt;/td&gt;
      &lt;td&gt;0.912029&lt;/td&gt;
      &lt;td&gt;0.335535&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;35000&lt;/td&gt;
      &lt;td&gt;0.640200&lt;/td&gt;
      &lt;td&gt;0.897706&lt;/td&gt;
      &lt;td&gt;0.332863&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;36000&lt;/td&gt;
      &lt;td&gt;0.606400&lt;/td&gt;
      &lt;td&gt;0.906883&lt;/td&gt;
      &lt;td&gt;0.334392&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;37000&lt;/td&gt;
      &lt;td&gt;0.602900&lt;/td&gt;
      &lt;td&gt;0.896555&lt;/td&gt;
      &lt;td&gt;0.332149&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;38000&lt;/td&gt;
      &lt;td&gt;0.609200&lt;/td&gt;
      &lt;td&gt;0.902984&lt;/td&gt;
      &lt;td&gt;0.332338&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;39000&lt;/td&gt;
      &lt;td&gt;0.580700&lt;/td&gt;
      &lt;td&gt;0.912111&lt;/td&gt;
      &lt;td&gt;0.332071&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;40000&lt;/td&gt;
      &lt;td&gt;0.567600&lt;/td&gt;
      &lt;td&gt;0.907288&lt;/td&gt;
      &lt;td&gt;0.331847&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;41000&lt;/td&gt;
      &lt;td&gt;0.563100&lt;/td&gt;
      &lt;td&gt;0.914157&lt;/td&gt;
      &lt;td&gt;0.331440&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;42000&lt;/td&gt;
      &lt;td&gt;0.582300&lt;/td&gt;
      &lt;td&gt;0.919074&lt;/td&gt;
      &lt;td&gt;0.330508&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;43000&lt;/td&gt;
      &lt;td&gt;0.557400&lt;/td&gt;
      &lt;td&gt;0.915264&lt;/td&gt;
      &lt;td&gt;0.331312&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;44000&lt;/td&gt;
      &lt;td&gt;0.545300&lt;/td&gt;
      &lt;td&gt;0.923404&lt;/td&gt;
      &lt;td&gt;0.330492&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;45000&lt;/td&gt;
      &lt;td&gt;0.533200&lt;/td&gt;
      &lt;td&gt;0.920011&lt;/td&gt;
      &lt;td&gt;0.330525&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;46000&lt;/td&gt;
      &lt;td&gt;0.518600&lt;/td&gt;
      &lt;td&gt;0.917619&lt;/td&gt;
      &lt;td&gt;0.328974&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;47000&lt;/td&gt;
      &lt;td&gt;0.519500&lt;/td&gt;
      &lt;td&gt;0.916954&lt;/td&gt;
      &lt;td&gt;0.329331&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;48000&lt;/td&gt;
      &lt;td&gt;0.510400&lt;/td&gt;
      &lt;td&gt;0.925846&lt;/td&gt;
      &lt;td&gt;0.328996&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;49000&lt;/td&gt;
      &lt;td&gt;0.501500&lt;/td&gt;
      &lt;td&gt;0.929667&lt;/td&gt;
      &lt;td&gt;0.329320&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;50000&lt;/td&gt;
      &lt;td&gt;0.517700&lt;/td&gt;
      &lt;td&gt;0.925447&lt;/td&gt;
      &lt;td&gt;0.328879&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;51000&lt;/td&gt;
      &lt;td&gt;0.520300&lt;/td&gt;
      &lt;td&gt;0.924588&lt;/td&gt;
      &lt;td&gt;0.328924&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[24]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;TrainOutput(global_step=51000, training_loss=1.2747246808070762, metrics={&amp;#39;train_runtime&amp;#39;: 19869.636, &amp;#39;train_samples_per_second&amp;#39;: 138.593, &amp;#39;train_steps_per_second&amp;#39;: 2.567, &amp;#39;total_flos&amp;#39;: 2.43363172711743e+20, &amp;#39;train_loss&amp;#39;: 1.2747246808070762, &amp;#39;epoch&amp;#39;: 20.0})&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="7.-Evaluate-and-Test-Inference"&gt;7. Evaluate and Test Inference&lt;a class="anchor-link" href="#7.-Evaluate-and-Test-Inference"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Now it's time to assess how well our final fine-tuned model performs. We evaluate on the validation set to compute the overall CER, then run inference on random samples to inspect individual predictions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[25]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Evaluate on validation set&lt;/span&gt;
&lt;span class="n"&gt;eval_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Evaluation Results:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  CER: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eval_results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;eval_cer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Loss: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eval_results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;eval_loss&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;



&lt;div class="output_html rendered_html output_subarea "&gt;

    &lt;div&gt;
      
      &lt;progress value='567' max='567' style='width:300px; height:20px; vertical-align: middle;'&gt;&lt;/progress&gt;
      [567/567 00:44]
    &lt;/div&gt;
    
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Evaluation Results:
  CER: 0.3289
  Loss: 0.9254
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Our model results in a CER of .33 on the validation set.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[26]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Run inference on a few samples&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cuda&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_available&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cpu&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get a few random samples&lt;/span&gt;
&lt;span class="n"&gt;num_samples&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;sample_indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval_dataset&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;num_samples&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Sample predictions:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sample_indices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eval_dataset&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Prepare input&lt;/span&gt;
    &lt;span class="n"&gt;input_values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;input_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unsqueeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Get prediction&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;no_grad&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;

    &lt;span class="n"&gt;pred_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Decode&lt;/span&gt;
    &lt;span class="n"&gt;pred_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred_ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;label_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;group_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Sample &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Ground truth: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label_str&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Prediction:   &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pred_str&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Calculate CER for this sample&lt;/span&gt;
    &lt;span class="n"&gt;cer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score_ipa_cer&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;label_str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pred_str&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  CER: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cer&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Sample predictions:
================================================================================

Sample 10476:
  Ground truth: dei ɑksd dʌ dɑːktɚ tu hæv gɪv sʌm fɑiv sents
  Prediction:   ðei ækst ðə dɑktɚ tu hæv gɪv sʌm fɑiv sɛnts
  CER: 0.1591

Sample 1824:
  Ground truth: nʊs
  Prediction:   nəs
  CER: 0.3333

Sample 409:
  Ground truth: ʧɹɑieŋgɫ
  Prediction:   ʧɹɑieŋgɫ
  CER: 0.0000

Sample 12149:
  Ground truth: ɔw
  Prediction:   ɔə
  CER: 0.5000

Sample 4506:
  Ground truth: ʃʌvɫ
  Prediction:   ʃʌvʊɫ
  CER: 0.2500

================================================================================
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Finally, we save the model, processor, and training configuration to disk.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[27]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Save model + processor for reuse on another machine&lt;/span&gt;
&lt;span class="n"&gt;save_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;models&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;wav2vec2-phonetic-final&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;save_dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Trainer saves model + config + tokenizer config if provided&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;save_dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Save processor artifacts (tokenizer + feature extractor)&lt;/span&gt;
&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;save_dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feature_extractor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;save_dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;training_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;save_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;training_args.pt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;hr&gt;
&lt;h1 id="Step-3:-Make-your-submission"&gt;Step 3: Make your submission&lt;a class="anchor-link" href="#Step-3:-Make-your-submission"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Since this is a code execution competition, we will submit our model weights and inference code rather than predictions. The platform runs your &lt;code&gt;main.py&lt;/code&gt; in a container, which must load your model and output the file &lt;code&gt;submission/submission.jsonl&lt;/code&gt;. See the &lt;a href="https://www.drivendata.org/competitions/309/childrens-phonetic-asr/page/981/"&gt;code submission format&lt;/a&gt; webpage for more information.&lt;/p&gt;
&lt;p&gt;The general steps to follow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Develop inference code&lt;/li&gt;
&lt;li&gt;Test your submission locally&lt;/li&gt;
&lt;li&gt;Package submission&lt;/li&gt;
&lt;li&gt;Make a smoke test submission&lt;/li&gt;
&lt;li&gt;Once you have successfully debugged your submission, submit it for scoring on the full test set!&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Develop-Inference-Code"&gt;Develop Inference Code&lt;a class="anchor-link" href="#Develop-Inference-Code"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We need to set up a repository with a &lt;code&gt;main.py&lt;/code&gt; Python script which performs inference in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main"&gt;competition execution environment&lt;/a&gt; and writes our predictions to the required output file.  During code execution, our submission will be unzipped and run in the cloud compute cluster. The container will run your &lt;code&gt;main.py&lt;/code&gt; script.&lt;/p&gt;
&lt;p&gt;Our code must write a JSON Lines (JSONL) file containing one prediction per utterance.&lt;/p&gt;
&lt;p&gt;Each line must include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;utterance_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phonetic_text&lt;/code&gt;: UTF-8, International Phonetic Alphabet (IPA) transcription of the utterance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The submission should be written to &lt;code&gt;./submission/submission.jsonl&lt;/code&gt; relative to the working directory.&lt;/p&gt;
&lt;p&gt;See more details in the &lt;a href="https://www.drivendata.org/competitions/309/childrens-phonetic-asr/page/981/"&gt;code submission format&lt;/a&gt; webpage and in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main/examples/phonetic/parakeet-cmudict"&gt;example submission&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In our &lt;code&gt;main.py&lt;/code&gt;, we load the fine-tuned Wav2Vec2 model and processor from the saved checkpoint directory, then run inference on all test utterances in batches. The script reads audio file paths from the test manifest, processes the audio through the model, decodes the model outputs to phonetic predictions, and writes the predicted phonetic transcriptions to the submission file in the required format. We batch utterances to improve GPU memory efficiency during processing.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub/blob/main/phonetic_submission/main.py"&gt;&lt;code&gt;phonetic_submission/main.py&lt;/code&gt;&lt;/a&gt; for the details.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Test-Submission-Locally"&gt;Test Submission Locally&lt;a class="anchor-link" href="#Test-Submission-Locally"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You should first and foremost test your submission locally. This is a great way to work out any bugs and ensure that your model performs inference successfully. See the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main?tab=readme-ov-file#testing-a-submission-locally"&gt;runtime repository's README&lt;/a&gt; for further instructions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;This repository provides a useful &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub/blob/main/justfile"&gt;justfile&lt;/a&gt; command to run the trained model on a few sample files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;test-phonetic:
&lt;span class="w"&gt;    &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;phonetic_submission/main.py&lt;span class="w"&gt; &lt;/span&gt;models/wav2vec2-phonetic-final/&lt;span class="w"&gt; &lt;/span&gt;data-demo/phonetic/utterance_metadata.jsonl
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Package-Submission"&gt;Package Submission&lt;a class="anchor-link" href="#Package-Submission"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Now we will package up our model and inference code into a zip file for predicting on the test set in the runtime container. This repository provides a &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub/blob/main/justfile"&gt;justfile&lt;/a&gt; command to do this. The command creates a zip file combining the trained Wav2Vec2 model with &lt;code&gt;/phonetic_submission/main.py&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pack-phonetic:
&lt;span class="w"&gt;    &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;phonetic_submission.zip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;phonetic_submission&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zip&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;../phonetic_submission.zip&lt;span class="w"&gt; &lt;/span&gt;main.py&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;models&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zip&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;../phonetic_submission.zip&lt;span class="w"&gt; &lt;/span&gt;wav2vec2-phonetic-final/&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Make-a-Smoke-Test-Submission"&gt;Make a Smoke Test Submission&lt;a class="anchor-link" href="#Make-a-Smoke-Test-Submission"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We provide a "smoke test" environment that replicates the test inference runtime but runs only on a small set of audio files. In the smoke test runtime, data/ contains 3,000 audio files from the training set.&lt;/p&gt;
&lt;p&gt;Let's submit our submission.zip to a smoke test on the platform.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;img src="../images/gates_asr_smoke_test_phonetic.png" alt="Smoke Test Submission"&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;After hitting "Submit" you can see the job in the queue—it will progress from "Uploading" to "Pending" to "Starting" to "Running" to "Scoring":&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;img src="../images/gates_asr_smoke_test_jobs_phonetic.png" alt="Smoke Test Code Jobs"&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Once your submission reaches "Completed", head on over to the "Submissions" tab to see your smoke test score.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Submit!"&gt;Submit!&lt;a class="anchor-link" href="#Submit!"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;After you've made sure a smoke test submission runs without error, you're ready to submit the real deal! This fine-tuned Wav2Vec2 model results in a .3460 CER on the full test set.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;img src="../images/gates_asr_submission_phonetic.png" alt="Full Submission"&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We encourage you to also be mindful of the submission limit (3 per 7 days at most) and others' code jobs. Canceled jobs do not count against the submission limit.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;If you want to share any of your findings or have questions, feel free to post on the &lt;a href="https://community.drivendata.org/c/childrens-asr/109"&gt;community forum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 

&lt;script type="application/vnd.jupyter.widget-state+json"&gt;
{"state": {"049b8367a7854c2b9f063e11a419633e": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "06bee07bef9a420399bbbbb6d3a0c071": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "1fdab8a17486495386816b64afe25e98": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "207c8f7212b841f0b183f9504e23c675": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": ""}}, "24f6941471954d13b0861fbc64535d67": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_049b8367a7854c2b9f063e11a419633e", "max": 152997, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_8e716a7a110f417196e5356accd15b45", "tabbable": null, "tooltip": null, "value": 152997}}, "4bf83a8eafeb4f64a3e2655cfc107183": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_92e7a1045bac42489f82cb8886e1b741", "placeholder": "\u200b", "style": "IPY_MODEL_1fdab8a17486495386816b64afe25e98", "tabbable": null, "tooltip": null, "value": "Map\u2007(num_proc=4):\u2007100%"}}, "5cb240e58e5246b5a68760fc1081661b": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_db3dcbcb8f854dfda7b58eca65dcb42c", "max": 152997, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_207c8f7212b841f0b183f9504e23c675", "tabbable": null, "tooltip": null, "value": 152997}}, "5d9c45ed677546679e504a8bef11dc67": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": ""}}, "86cc3b3093e646438d00e4751b1d64ce": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "8e716a7a110f417196e5356accd15b45": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": ""}}, "92e7a1045bac42489f82cb8886e1b741": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "99f3dbbf34c24e5ebb09b2662ee2a19f": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "9ee9afb6c360410b96b9139615d0ad89": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_eb28390ab863499bbf7d09b26b5b4128", "placeholder": "\u200b", "style": "IPY_MODEL_c500c085e4c6469680f5dd6814420ae1", "tabbable": null, "tooltip": null, "value": "Filter\u2007(num_proc=4):\u2007100%"}}, "9ef0e2eb451040f899ae223490de412a": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "9f8b3739e9bc4d55893f61001d43bdb1": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": ["IPY_MODEL_9ee9afb6c360410b96b9139615d0ad89", "IPY_MODEL_b6a9f1067f944b37822b5665f475e2a4", "IPY_MODEL_f982025238c046789b6615673321793e"], "layout": "IPY_MODEL_99f3dbbf34c24e5ebb09b2662ee2a19f", "tabbable": null, "tooltip": null}}, "a6a186c242a544209aa80ca0f299117e": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_bb66598d3d894b8597a9f6c2c1a7e0f1", "placeholder": "\u200b", "style": "IPY_MODEL_b5b553c3cd1046f5a5884ec6e1bed35e", "tabbable": null, "tooltip": null, "value": "\u2007152997/152997\u2007[04:39&amp;lt;00:00,\u2007594.52\u2007examples/s]"}}, "a756351f6a734b55b21f522dcc89a8b1": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_c48443fd337846fe9c7218cce0e0eca3", "placeholder": "\u200b", "style": "IPY_MODEL_b98951a904b54c6a9222fa1b4698eb9c", "tabbable": null, "tooltip": null, "value": "\u2007152997/152997\u2007[08:35&amp;lt;00:00,\u2007437.64\u2007examples/s]"}}, "aa4351d054024f288106250061321042": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "add76dca952b4117821f9805699156ae": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "afac6b67801c42bba4c5f5a86a71fa86": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "b5b553c3cd1046f5a5884ec6e1bed35e": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "b6a9f1067f944b37822b5665f475e2a4": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_86cc3b3093e646438d00e4751b1d64ce", "max": 152997, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_5d9c45ed677546679e504a8bef11dc67", "tabbable": null, "tooltip": null, "value": 152997}}, "b98951a904b54c6a9222fa1b4698eb9c": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "bb66598d3d894b8597a9f6c2c1a7e0f1": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "c141760086a6480a854587da715c5fe2": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "c48443fd337846fe9c7218cce0e0eca3": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "c500c085e4c6469680f5dd6814420ae1": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "db3dcbcb8f854dfda7b58eca65dcb42c": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "de4b00eba3014bf3b5f29e12fc79f288": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": ["IPY_MODEL_fd6c9a7b93c24b86a44e694422408f8d", "IPY_MODEL_24f6941471954d13b0861fbc64535d67", "IPY_MODEL_a6a186c242a544209aa80ca0f299117e"], "layout": "IPY_MODEL_aa4351d054024f288106250061321042", "tabbable": null, "tooltip": null}}, "eb28390ab863499bbf7d09b26b5b4128": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "f982025238c046789b6615673321793e": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_06bee07bef9a420399bbbbb6d3a0c071", "placeholder": "\u200b", "style": "IPY_MODEL_9ef0e2eb451040f899ae223490de412a", "tabbable": null, "tooltip": null, "value": "\u2007152997/152997\u2007[12:41&amp;lt;00:00,\u200786.68\u2007examples/s]"}}, "fc60459a179b494faad51aaf440b9314": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": ["IPY_MODEL_4bf83a8eafeb4f64a3e2655cfc107183", "IPY_MODEL_5cb240e58e5246b5a68760fc1081661b", "IPY_MODEL_a756351f6a734b55b21f522dcc89a8b1"], "layout": "IPY_MODEL_afac6b67801c42bba4c5f5a86a71fa86", "tabbable": null, "tooltip": null}}, "fd6c9a7b93c24b86a44e694422408f8d": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_c141760086a6480a854587da715c5fe2", "placeholder": "\u200b", "style": "IPY_MODEL_add76dca952b4117821f9805699156ae", "tabbable": null, "tooltip": null, "value": "Saving\u2007the\u2007dataset\u2007(78/78\u2007shards):\u2007100%"}}}, "version_major": 2, "version_minor": 0}
&lt;/script&gt;


&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: 'center'," +
        "    displayIndent: '0em'," +
        "    showMathMenu: true," +
        "    tex2jax: { " +
        "        inlineMath: [ ['$','$'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        " linebreaks: { automatic: true, width: '95% container' }, " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
        "    } " +
        "}); ";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;
</content><category term="blog"></category><category term="tutorial"></category><category term="competition"></category><category term="audio data"></category><category term="education"></category></entry><entry><title>Improving Automatic Speech Recognition for Kids - A Reference Implementation for Word-level Transcription</title><link href="https://www.drivendata.co/blog/child-asr-word-benchmark" rel="alternate"></link><published>2026-02-27T00:00:00-05:00</published><updated>2026-02-27T00:00:00-05:00</updated><author><name>Jackie Glasheen</name></author><id>tag:www.drivendata.co,2026-02-27:/blog/child-asr-word-benchmark</id><summary type="html">&lt;p&gt;Learn how to train a model to transcribe child speech for the On Top of Pasketti Challenge (Word Track)&lt;/p&gt;</summary><content type="html">&lt;style type="text/css"&gt;/*!
*
* IPython notebook
*
*/
/* CSS font colors for translated ANSI escape sequences */
/* The color values are a mix of
   http://www.xcolors.net/dl/baskerville-ivorylight and
   http://www.xcolors.net/dl/euphrasia */
.ansi-black-fg {
  color: #3E424D;
}
.ansi-black-bg {
  background-color: #3E424D;
}
.ansi-black-intense-fg {
  color: #282C36;
}
.ansi-black-intense-bg {
  background-color: #282C36;
}
.ansi-red-fg {
  color: #E75C58;
}
.ansi-red-bg {
  background-color: #E75C58;
}
.ansi-red-intense-fg {
  color: #B22B31;
}
.ansi-red-intense-bg {
  background-color: #B22B31;
}
.ansi-green-fg {
  color: #00A250;
}
.ansi-green-bg {
  background-color: #00A250;
}
.ansi-green-intense-fg {
  color: #007427;
}
.ansi-green-intense-bg {
  background-color: #007427;
}
.ansi-yellow-fg {
  color: #DDB62B;
}
.ansi-yellow-bg {
  background-color: #DDB62B;
}
.ansi-yellow-intense-fg {
  color: #B27D12;
}
.ansi-yellow-intense-bg {
  background-color: #B27D12;
}
.ansi-blue-fg {
  color: #208FFB;
}
.ansi-blue-bg {
  background-color: #208FFB;
}
.ansi-blue-intense-fg {
  color: #0065CA;
}
.ansi-blue-intense-bg {
  background-color: #0065CA;
}
.ansi-magenta-fg {
  color: #D160C4;
}
.ansi-magenta-bg {
  background-color: #D160C4;
}
.ansi-magenta-intense-fg {
  color: #A03196;
}
.ansi-magenta-intense-bg {
  background-color: #A03196;
}
.ansi-cyan-fg {
  color: #60C6C8;
}
.ansi-cyan-bg {
  background-color: #60C6C8;
}
.ansi-cyan-intense-fg {
  color: #258F8F;
}
.ansi-cyan-intense-bg {
  background-color: #258F8F;
}
.ansi-white-fg {
  color: #C5C1B4;
}
.ansi-white-bg {
  background-color: #C5C1B4;
}
.ansi-white-intense-fg {
  color: #A1A6B2;
}
.ansi-white-intense-bg {
  background-color: #A1A6B2;
}
.ansi-default-inverse-fg {
  color: #FFFFFF;
}
.ansi-default-inverse-bg {
  background-color: #000000;
}
.ansi-bold {
  font-weight: bold;
}
.ansi-underline {
  text-decoration: underline;
}
/* The following styles are deprecated an will be removed in a future version */
.ansibold {
  font-weight: bold;
}
.ansi-inverse {
  outline: 0.5px dotted;
}
/* use dark versions for foreground, to improve visibility */
.ansiblack {
  color: black;
}
.ansired {
  color: darkred;
}
.ansigreen {
  color: darkgreen;
}
.ansiyellow {
  color: #c4a000;
}
.ansiblue {
  color: darkblue;
}
.ansipurple {
  color: darkviolet;
}
.ansicyan {
  color: steelblue;
}
.ansigray {
  color: gray;
}
/* and light for background, for the same reason */
.ansibgblack {
  background-color: black;
}
.ansibgred {
  background-color: red;
}
.ansibggreen {
  background-color: green;
}
.ansibgyellow {
  background-color: yellow;
}
.ansibgblue {
  background-color: blue;
}
.ansibgpurple {
  background-color: magenta;
}
.ansibgcyan {
  background-color: cyan;
}
.ansibggray {
  background-color: gray;
}
div.cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-radius: 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  border-width: 1px;
  border-style: solid;
  border-color: transparent;
  width: 100%;
  padding: 5px;
  /* This acts as a spacer between cells, that is outside the border */
  margin: 0px;
  outline: none;
  position: relative;
  overflow: visible;
}
div.cell:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: transparent;
}
div.cell.jupyter-soft-selected {
  border-left-color: #E3F2FD;
  border-left-width: 1px;
  padding-left: 5px;
  border-right-color: #E3F2FD;
  border-right-width: 1px;
  background: #E3F2FD;
}
@media print {
  div.cell.jupyter-soft-selected {
    border-color: transparent;
  }
}
div.cell.selected,
div.cell.selected.jupyter-soft-selected {
  border-color: #ababab;
}
div.cell.selected:before,
div.cell.selected.jupyter-soft-selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #42A5F5;
}
@media print {
  div.cell.selected,
  div.cell.selected.jupyter-soft-selected {
    border-color: transparent;
  }
}
.edit_mode div.cell.selected {
  border-color: #66BB6A;
}
.edit_mode div.cell.selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #66BB6A;
}
@media print {
  .edit_mode div.cell.selected {
    border-color: transparent;
  }
}
.prompt {
  /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
  min-width: 14ex;
  /* This padding is tuned to match the padding on the CodeMirror editor. */
  padding: 0.4em;
  margin: 0px;
  font-family: monospace;
  text-align: right;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
  /* Don't highlight prompt number selection */
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  /* Use default cursor */
  cursor: default;
}
@media (max-width: 540px) {
  .prompt {
    text-align: left;
  }
}
div.inner_cell {
  min-width: 0;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_area {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
}
/* This is needed so that empty prompt areas can collapse to zero height when there
   is no content in the output_subarea and the prompt. The main purpose of this is
   to make sure that empty JavaScript output_subareas have no height. */
div.prompt:empty {
  padding-top: 0;
  padding-bottom: 0;
}
div.unrecognized_cell {
  padding: 5px 5px 5px 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.unrecognized_cell .inner_cell {
  border-radius: 2px;
  padding: 5px;
  font-weight: bold;
  color: red;
  border: 1px solid #cfcfcf;
  background: #eaeaea;
}
div.unrecognized_cell .inner_cell a {
  color: inherit;
  text-decoration: none;
}
div.unrecognized_cell .inner_cell a:hover {
  color: inherit;
  text-decoration: none;
}
@media (max-width: 540px) {
  div.unrecognized_cell &gt; div.prompt {
    display: none;
  }
}
div.code_cell {
  /* avoid page breaking on code cells when printing */
}
@media print {
  div.code_cell {
    page-break-inside: avoid;
  }
}
/* any special styling for code cells that are currently running goes here */
div.input {
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.input {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_prompt {
  color: #303F9F;
  border-top: 1px solid transparent;
}
div.input_area &gt; div.highlight {
  margin: 0.4em;
  border: none;
  padding: 0px;
  background-color: transparent;
}
div.input_area &gt; div.highlight &gt; pre {
  margin: 0px;
  border: none;
  padding: 0px;
  background-color: transparent;
}
/* The following gets added to the &lt;head&gt; if it is detected that the user has a
 * monospace font with inconsistent normal/bold/italic height.  See
 * notebookmain.js.  Such fonts will have keywords vertically offset with
 * respect to the rest of the text.  The user should select a better font.
 * See: https://github.com/ipython/ipython/issues/1503
 *
 * .CodeMirror span {
 *      vertical-align: bottom;
 * }
 */
.CodeMirror {
  line-height: 1.21429em;
  /* Changed from 1em to our global default */
  font-size: 14px;
  height: auto;
  /* Changed to auto to autogrow */
  background: none;
  /* Changed from white to allow our bg to show through */
}
.CodeMirror-scroll {
  /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
  /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
  overflow-y: hidden;
  overflow-x: auto;
}
.CodeMirror-lines {
  /* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because */
  /* we have set a different line-height and want this to scale with that. */
  /* Note that this should set vertical padding only, since CodeMirror assumes
       that horizontal padding will be set on CodeMirror pre */
  padding: 0.4em 0;
}
.CodeMirror-linenumber {
  padding: 0 8px 0 4px;
}
.CodeMirror-gutters {
  border-bottom-left-radius: 2px;
  border-top-left-radius: 2px;
}
.CodeMirror pre {
  /* In CM3 this went to 4px from 0 in CM2. This sets horizontal padding only,
    use .CodeMirror-lines for vertical */
  padding: 0 0.4em;
  border: 0;
  border-radius: 0;
}
.CodeMirror-cursor {
  border-left: 1.4px solid black;
}
@media screen and (min-width: 2138px) and (max-width: 4319px) {
  .CodeMirror-cursor {
    border-left: 2px solid black;
  }
}
@media screen and (min-width: 4320px) {
  .CodeMirror-cursor {
    border-left: 4px solid black;
  }
}
/*

Original style from softwaremaniacs.org (c) Ivan Sagalaev &lt;Maniac@SoftwareManiacs.Org&gt;
Adapted from GitHub theme

*/
.highlight-base {
  color: #000;
}
.highlight-variable {
  color: #000;
}
.highlight-variable-2 {
  color: #1a1a1a;
}
.highlight-variable-3 {
  color: #333333;
}
.highlight-string {
  color: #BA2121;
}
.highlight-comment {
  color: #408080;
  font-style: italic;
}
.highlight-number {
  color: #080;
}
.highlight-atom {
  color: #88F;
}
.highlight-keyword {
  color: #008000;
  font-weight: bold;
}
.highlight-builtin {
  color: #008000;
}
.highlight-error {
  color: #f00;
}
.highlight-operator {
  color: #AA22FF;
  font-weight: bold;
}
.highlight-meta {
  color: #AA22FF;
}
/* previously not defined, copying from default codemirror */
.highlight-def {
  color: #00f;
}
.highlight-string-2 {
  color: #f50;
}
.highlight-qualifier {
  color: #555;
}
.highlight-bracket {
  color: #997;
}
.highlight-tag {
  color: #170;
}
.highlight-attribute {
  color: #00c;
}
.highlight-header {
  color: blue;
}
.highlight-quote {
  color: #090;
}
.highlight-link {
  color: #00c;
}
/* apply the same style to codemirror */
.cm-s-ipython span.cm-keyword {
  color: #008000;
  font-weight: bold;
}
.cm-s-ipython span.cm-atom {
  color: #88F;
}
.cm-s-ipython span.cm-number {
  color: #080;
}
.cm-s-ipython span.cm-def {
  color: #00f;
}
.cm-s-ipython span.cm-variable {
  color: #000;
}
.cm-s-ipython span.cm-operator {
  color: #AA22FF;
  font-weight: bold;
}
.cm-s-ipython span.cm-variable-2 {
  color: #1a1a1a;
}
.cm-s-ipython span.cm-variable-3 {
  color: #333333;
}
.cm-s-ipython span.cm-comment {
  color: #408080;
  font-style: italic;
}
.cm-s-ipython span.cm-string {
  color: #BA2121;
}
.cm-s-ipython span.cm-string-2 {
  color: #f50;
}
.cm-s-ipython span.cm-meta {
  color: #AA22FF;
}
.cm-s-ipython span.cm-qualifier {
  color: #555;
}
.cm-s-ipython span.cm-builtin {
  color: #008000;
}
.cm-s-ipython span.cm-bracket {
  color: #997;
}
.cm-s-ipython span.cm-tag {
  color: #170;
}
.cm-s-ipython span.cm-attribute {
  color: #00c;
}
.cm-s-ipython span.cm-header {
  color: blue;
}
.cm-s-ipython span.cm-quote {
  color: #090;
}
.cm-s-ipython span.cm-link {
  color: #00c;
}
.cm-s-ipython span.cm-error {
  color: #f00;
}
.cm-s-ipython span.cm-tab {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
}
div.output_wrapper {
  /* this position must be relative to enable descendents to be absolute within it */
  position: relative;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  z-index: 1;
}
/* class for the output area when it should be height-limited */
div.output_scroll {
  /* ideally, this would be max-height, but FF barfs all over that */
  height: 24em;
  /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */
  width: 100%;
  overflow: auto;
  border-radius: 2px;
  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  display: block;
}
/* output div while it is collapsed */
div.output_collapsed {
  margin: 0px;
  padding: 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
div.out_prompt_overlay {
  height: 100%;
  padding: 0px 0.4em;
  position: absolute;
  border-radius: 2px;
}
div.out_prompt_overlay:hover {
  /* use inner shadow to get border that is computed the same on WebKit/FF */
  -webkit-box-shadow: inset 0 0 1px #000;
  box-shadow: inset 0 0 1px #000;
  background: rgba(240, 240, 240, 0.5);
}
div.output_prompt {
  color: #D84315;
}
/* This class is the outer container of all output sections. */
div.output_area {
  padding: 0px;
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.output_area .MathJax_Display {
  text-align: left !important;
}
div.output_area 
div.output_area 
div.output_area img,
div.output_area svg {
  max-width: 100%;
  height: auto;
}
div.output_area img.unconfined,
div.output_area svg.unconfined {
  max-width: none;
}
div.output_area .mglyph &gt; img {
  max-width: none;
}
/* This is needed to protect the pre formating from global settings such
   as that of bootstrap */
.output {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.output_area {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
div.output_area pre {
  margin: 0;
  padding: 1px 0 1px 0;
  border: 0;
  vertical-align: baseline;
  color: black;
  background-color: transparent;
  border-radius: 0;
}
/* This class is for the output subarea inside the output_area and after
   the prompt div. */
div.output_subarea {
  overflow-x: auto;
  padding: 0.4em;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
  max-width: calc(100% - 14ex);
}
div.output_scroll div.output_subarea {
  overflow-x: visible;
}
/* The rest of the output_* classes are for special styling of the different
   output types */
/* all text output has this class: */
div.output_text {
  text-align: left;
  color: #000;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
}
/* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
div.output_stderr {
  background: #fdd;
  /* very light red background for stderr */
}
div.output_latex {
  text-align: left;
}
/* Empty output_javascript divs should have no height */
div.output_javascript:empty {
  padding: 0;
}
.js-error {
  color: darkred;
}
/* raw_input styles */
div.raw_input_container {
  line-height: 1.21429em;
  padding-top: 5px;
}
pre.raw_input_prompt {
  /* nothing needed here. */
}
input.raw_input {
  font-family: monospace;
  font-size: inherit;
  color: inherit;
  width: auto;
  /* make sure input baseline aligns with prompt */
  vertical-align: baseline;
  /* padding + margin = 0.5em between prompt and cursor */
  padding: 0em 0.25em;
  margin: 0em 0.25em;
}
input.raw_input:focus {
  box-shadow: none;
}
p.p-space {
  margin-bottom: 10px;
}
div.output_unrecognized {
  padding: 5px;
  font-weight: bold;
  color: red;
}
div.output_unrecognized a {
  color: inherit;
  text-decoration: none;
}
div.output_unrecognized a:hover {
  color: inherit;
  text-decoration: none;
}
.rendered_html {
  color: #000;
  /* any extras will just be numbers: */
}



.rendered_html :link {
  text-decoration: underline;
}
.rendered_html :visited {
  text-decoration: underline;
}






.rendered_html h1:first-child {
  margin-top: 0.538em;
}
.rendered_html h2:first-child {
  margin-top: 0.636em;
}
.rendered_html h3:first-child {
  margin-top: 0.777em;
}
.rendered_html h4:first-child {
  margin-top: 1em;
}
.rendered_html h5:first-child {
  margin-top: 1em;
}
.rendered_html h6:first-child {
  margin-top: 1em;
}
.rendered_html ul:not(.list-inline),
.rendered_html ol:not(.list-inline) {
  padding-left: 2em;
}








.rendered_html * + ul {
  margin-top: 1em;
}
.rendered_html * + ol {
  margin-top: 1em;
}





.rendered_html pre,




.rendered_html tr,
.rendered_html th,


.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
.rendered_html * + table {
  margin-top: 1em;
}

.rendered_html * + p {
  margin-top: 1em;
}

.rendered_html * + img {
  margin-top: 1em;
}
.rendered_html img,

.rendered_html img.unconfined,


.rendered_html * + .alert {
  margin-top: 1em;
}
[dir="rtl"] 
div.text_cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.text_cell &gt; div.prompt {
    display: none;
  }
}
div.text_cell_render {
  /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
  outline: none;
  resize: none;
  width: inherit;
  border-style: none;
  padding: 0.5em 0.5em 0.5em 0.4em;
  color: #000;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
a.anchor-link:link {
  text-decoration: none;
  padding: 0px 20px;
  visibility: hidden;
}
h1:hover .anchor-link,
h2:hover .anchor-link,
h3:hover .anchor-link,
h4:hover .anchor-link,
h5:hover .anchor-link,
h6:hover .anchor-link {
  visibility: visible;
}
.text_cell.rendered .input_area {
  display: none;
}
.text_cell.rendered 
.text_cell.rendered .rendered_html tr,
.text_cell.rendered .rendered_html th,
.text_cell.rendered 
.text_cell.unrendered .text_cell_render {
  display: none;
}
.text_cell .dropzone .input_area {
  border: 2px dashed #bababa;
  margin: -1px;
}
.cm-header-1,
.cm-header-2,
.cm-header-3,
.cm-header-4,
.cm-header-5,
.cm-header-6 {
  font-weight: bold;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.cm-header-1 {
  font-size: 185.7%;
}
.cm-header-2 {
  font-size: 157.1%;
}
.cm-header-3 {
  font-size: 128.6%;
}
.cm-header-4 {
  font-size: 110%;
}
.cm-header-5 {
  font-size: 100%;
  font-style: italic;
}
.cm-header-6 {
  font-size: 100%;
  font-style: italic;
}
&lt;/style&gt;
&lt;style type="text/css"&gt;pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight pre  .hll { background-color: #ffffcc }
 .highlight pre  { background: #f8f8f8; }
 .highlight pre  .c { color: #3D7B7B; font-style: italic } /* Comment */
 .highlight pre  .err { border: 1px solid #F00 } /* Error */
 .highlight pre  .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight pre  .o { color: #666 } /* Operator */
 .highlight pre  .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
 .highlight pre  .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
 .highlight pre  .cp { color: #9C6500 } /* Comment.Preproc */
 .highlight pre  .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
 .highlight pre  .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
 .highlight pre  .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
 .highlight pre  .gd { color: #A00000 } /* Generic.Deleted */
 .highlight pre  .ge { font-style: italic } /* Generic.Emph */
 .highlight pre  .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
 .highlight pre  .gr { color: #E40000 } /* Generic.Error */
 .highlight pre  .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight pre  .gi { color: #008400 } /* Generic.Inserted */
 .highlight pre  .go { color: #717171 } /* Generic.Output */
 .highlight pre  .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight pre  .gs { font-weight: bold } /* Generic.Strong */
 .highlight pre  .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 .highlight pre  .gt { color: #04D } /* Generic.Traceback */
 .highlight pre  .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
 .highlight pre  .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
 .highlight pre  .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
 .highlight pre  .kp { color: #008000 } /* Keyword.Pseudo */
 .highlight pre  .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
 .highlight pre  .kt { color: #B00040 } /* Keyword.Type */
 .highlight pre  .m { color: #666 } /* Literal.Number */
 .highlight pre  .s { color: #BA2121 } /* Literal.String */
 .highlight pre  .na { color: #687822 } /* Name.Attribute */
 .highlight pre  .nb { color: #008000 } /* Name.Builtin */
 .highlight pre  .nc { color: #00F; font-weight: bold } /* Name.Class */
 .highlight pre  .no { color: #800 } /* Name.Constant */
 .highlight pre  .nd { color: #A2F } /* Name.Decorator */
 .highlight pre  .ni { color: #717171; font-weight: bold } /* Name.Entity */
 .highlight pre  .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
 .highlight pre  .nf { color: #00F } /* Name.Function */
 .highlight pre  .nl { color: #767600 } /* Name.Label */
 .highlight pre  .nn { color: #00F; font-weight: bold } /* Name.Namespace */
 .highlight pre  .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight pre  .nv { color: #19177C } /* Name.Variable */
 .highlight pre  .ow { color: #A2F; font-weight: bold } /* Operator.Word */
 .highlight pre  .w { color: #BBB } /* Text.Whitespace */
 .highlight pre  .mb { color: #666 } /* Literal.Number.Bin */
 .highlight pre  .mf { color: #666 } /* Literal.Number.Float */
 .highlight pre  .mh { color: #666 } /* Literal.Number.Hex */
 .highlight pre  .mi { color: #666 } /* Literal.Number.Integer */
 .highlight pre  .mo { color: #666 } /* Literal.Number.Oct */
 .highlight pre  .sa { color: #BA2121 } /* Literal.String.Affix */
 .highlight pre  .sb { color: #BA2121 } /* Literal.String.Backtick */
 .highlight pre  .sc { color: #BA2121 } /* Literal.String.Char */
 .highlight pre  .dl { color: #BA2121 } /* Literal.String.Delimiter */
 .highlight pre  .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
 .highlight pre  .s2 { color: #BA2121 } /* Literal.String.Double */
 .highlight pre  .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
 .highlight pre  .sh { color: #BA2121 } /* Literal.String.Heredoc */
 .highlight pre  .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
 .highlight pre  .sx { color: #008000 } /* Literal.String.Other */
 .highlight pre  .sr { color: #A45A77 } /* Literal.String.Regex */
 .highlight pre  .s1 { color: #BA2121 } /* Literal.String.Single */
 .highlight pre  .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight pre  .bp { color: #008000 } /* Name.Builtin.Pseudo */
 .highlight pre  .fm { color: #00F } /* Name.Function.Magic */
 .highlight pre  .vc { color: #19177C } /* Name.Variable.Class */
 .highlight pre  .vg { color: #19177C } /* Name.Variable.Global */
 .highlight pre  .vi { color: #19177C } /* Name.Variable.Instance */
 .highlight pre  .vm { color: #19177C } /* Name.Variable.Magic */
 .highlight pre  .il { color: #666 } /* Literal.Number.Integer.Long */&lt;/style&gt;&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Welcome to the reference implementation tutorial notebook for the &lt;strong&gt;On Top of Pasketti: Children’s Speech Recognition Challenge - Word Track&lt;/strong&gt;! If you are just getting started, we recommend reading the &lt;a href="https://www.drivendata.org/competitions/308/childrens-word-asr/"&gt;competition webpage&lt;/a&gt; first.&lt;/p&gt;
&lt;p&gt;The goal of this tutorial is to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Demonstrate how to &lt;a href="#Step-1:-Load-and-explore-the-data"&gt;load and explore the data&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Provide a basic framework for &lt;a href="#Step-2:-Build-the-model"&gt;building a model&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Demonstrate how to &lt;a href="#Step-3:-Make-your-submission"&gt;package your work&lt;/a&gt; correctly for submission.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In this tutorial, we will &lt;a href="https://github.com/NVIDIA-NeMo/NeMo/tree/main/examples/asr/asr_adapters"&gt;adapt&lt;/a&gt; NVIDIA's Parakeet model, a pretrained ASR model, using &lt;a href="https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/asr/intro.html"&gt;NeMo&lt;/a&gt;. You can either expand on and improve the method in this notebook, or start with something completely different! Let's get started.&lt;/p&gt;
&lt;hr&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Background"&gt;Background&lt;a class="anchor-link" href="#Background"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Spoken language is a natural way for kids to learn, explore, and show what they know, yet today's Automatic Speech Recognition (ASR) technology hardly understands them. Most ASR systems are built on adult speech, and struggle with the pitch, rhythm, and evolving articulation of young learners.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.drivendata.org/competitions/group/childrens-asr-competition/"&gt;On Top of Pasketti: Children’s Speech Recognition Challenge&lt;/a&gt; assembles pre-existing and newly labeled datasets to advance speech models that truly work for children. Your goal in the &lt;a href="https://www.drivendata.org/competitions/308/childrens-word-asr/"&gt;Word Track&lt;/a&gt; is to develop models that accurately predict the words spoken by children in short audio clips.&lt;/p&gt;
&lt;p&gt;This is a &lt;a href="https://drivendata.co/blog/code-execution-competitions"&gt;code execution challenge&lt;/a&gt;! Rather than submitting your predicted labels, you will package your trained model and the prediction code and submit that for containerized execution. See the &lt;a href="https://www.drivendata.org/competitions/308/childrens-word-asr/page/978/"&gt;code submission format&lt;/a&gt; webpage and the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main"&gt;runtime repository&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;If you'd like to rerun this notebook, the notebook file can be downloaded from the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub"&gt;reference implementation repository&lt;/a&gt;. That repository also includes all code imported into the notebook.&lt;/p&gt;
&lt;hr&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h1 id="Step-0:-Import-packages"&gt;Step 0: Import packages&lt;a class="anchor-link" href="#Step-0:-Import-packages"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;First, create your environment. We use &lt;code&gt;uv&lt;/code&gt; as the package manager in this benchmark repository. &lt;strong&gt;To run this notebook, you must be on a Linux machine with GPU access.&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an environment: &lt;code&gt;just create-environment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Activate the environment: &lt;code&gt;source ./.venv/bin/activate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install the requirements found in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub/blob/main/pyproject.toml"&gt;TOML file&lt;/a&gt; into the environment: &lt;code&gt;just requirements&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Remember, the runtime repository's &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/blob/main/runtime/pyproject.toml"&gt;TOML file&lt;/a&gt; lists the packages that will be available for running inference using model submissions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We'll be using NVIDIA's NeMo framework to build our model along with standard data science Python libraries to explore and prepare the data. Because this is a code execution challenge, we'll also be testing our solutions locally before packaging our model and inference code for submission. To help us with scoring, we've imported some utility functions from the competition's &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime"&gt;runtime repository&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Standard library&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="c1"&gt;# Visualization&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ticker&lt;/span&gt;

&lt;span class="c1"&gt;# Core ML &amp;amp; audio stack&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;librosa&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lightning.pytorch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pl&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;torch&lt;/span&gt;

&lt;span class="c1"&gt;# ASR models &amp;amp; normalization&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;nemo.collections.asr.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ASRModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;transformers.models.whisper.english_normalizer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;EnglishTextNormalizer&lt;/span&gt;

&lt;span class="c1"&gt;# Training &amp;amp; experiment utilities&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;loguru&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;nemo.utils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;nemo.utils.exp_manager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;exp_manager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;nemo.utils.trainer_utils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;resolve_trainer_cfg&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;omegaconf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OmegaConf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;open_dict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.model_selection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;

&lt;span class="c1"&gt;# Project utilities&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;asr_benchmark.config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DATA_ROOT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;asr_benchmark.nemo_adapter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;add_global_adapter_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;patch_transcribe_lhotse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;update_model_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;update_model_config_to_support_adapter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;asr_benchmark.score&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;english_spelling_normalizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score_wer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stderr output_text"&gt;
&lt;pre&gt;fused_indices_to_multihot has reached end of life. Please migrate to a non-experimental function.
OneLogger: Setting error_handling_strategy to DISABLE_QUIETLY_AND_REPORT_METRIC_ERROR for rank (rank=0) with OneLogger disabled. To override: explicitly set error_handling_strategy parameter.
No exporters were provided. This means that no telemetry data will be collected.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_float32_matmul_precision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;high&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Set SAMPLE to use a smaller subset of the data for faster iteration during development. Set it to None to use the full dataset.&lt;/span&gt;
&lt;span class="n"&gt;SAMPLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;hr&gt;
&lt;h1 id="Step-1:-Load-and-explore-the-data"&gt;Step 1: Load and explore the data&lt;a class="anchor-link" href="#Step-1:-Load-and-explore-the-data"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;First, you'll likely want to set up your own repository for developing a solution.  We recommend using &lt;a href="https://cookiecutter-data-science.drivendata.org/"&gt;Cookiecutter Data Science&lt;/a&gt;, which ensures an easy-to-navigate project structure.&lt;/p&gt;
&lt;p&gt;We'll download all of the competition data to our "raw" folder. There are two distinct training corpora that share the same structure but contain different data, and are hosted in separate locations for participant access. One corpus is hosted on the DrivenData platform, while a second corpus, which follows the same schema but contains different data, is provided by TalkBank. See the &lt;a href="https://www.drivendata.org/competitions/308/childrens-word-asr/data/"&gt;Data Download&lt;/a&gt; page for access instructions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Our local data structure after downloading all files to a raw data folder is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;childrens-speech-recognition-benchmark-pub/data/raw
├──&lt;span class="w"&gt; &lt;/span&gt;drivendata
│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio_part_0.zip
│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio_part_1.zip
│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio_part_2.zip
│&lt;span class="w"&gt;   &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;train_word_transcripts.jsonl
└──&lt;span class="w"&gt; &lt;/span&gt;talkbank
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio.zip
&lt;span class="w"&gt;    &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;train_word_transcripts.jsonl
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;After unzipping the files, you may want to consolidate the audio files into a single "audio" folder within the drivendata directory, where audio are split into multiple zip files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;rsync&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;./data/raw/drivendata/&lt;span class="s2"&gt;&amp;quot;audio 3&amp;quot;&lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;./data/raw/drivendata/audio/
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;childrens-speech-recognition-benchmark-pub/data/raw
├──&lt;span class="w"&gt; &lt;/span&gt;drivendata
│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio/
│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio_part_0.zip
│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio_part_1.zip
│&lt;span class="w"&gt;   &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio_part_2.zip
│&lt;span class="w"&gt;   &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;train_word_transcripts.jsonl
└──&lt;span class="w"&gt; &lt;/span&gt;talkbank
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio/
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;audio.zip
&lt;span class="w"&gt;    &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;train_word_transcripts.jsonl
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;For each of the two corpora, the file train_word_transcripts.jsonl contains the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;utterance_id&lt;/code&gt; (str) - unique identifier for each utterance&lt;/li&gt;
&lt;li&gt;&lt;code&gt;child_id&lt;/code&gt; (str) - unique, anonymized identifier for the speaker&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session_id&lt;/code&gt; (str) - unique identifier for the recording session; a single child_id may be associated with multiple session_ids&lt;/li&gt;
&lt;li&gt;&lt;code&gt;audio_path&lt;/code&gt; (str) - path to the corresponding .flac audio file relative to the /audio directory, following the pattern audio/{utterance_id}.flac&lt;/li&gt;
&lt;li&gt;&lt;code&gt;audio_duration_sec&lt;/code&gt; (float) - duration of the audio clip in seconds&lt;/li&gt;
&lt;li&gt;&lt;code&gt;age_bucket&lt;/code&gt; (str) - age range of the child at the time of recording ("3-4", "5-7", "8-11", "12+", or "unknown")&lt;/li&gt;
&lt;li&gt;&lt;code&gt;md5_hash&lt;/code&gt; (str) - MD5 checksum of the audio file, used for integrity verification&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filesize_bytes&lt;/code&gt; (int) - size of the audio file in bytes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orthographic_text&lt;/code&gt; (str) - normalized orthographic transcription of the utterance&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Each line in the JSONL manifest corresponds to a single utterance and references exactly one associated audio file. The &lt;code&gt;orthographic_text&lt;/code&gt; field contains a manually created, minimally normalized orthographic transcription that serves as the training label.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Let's-explore-the-metadata!"&gt;Let's explore the metadata!&lt;a class="anchor-link" href="#Let's-explore-the-metadata!"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We will load the JSONL transcripts and explore some of the metadata. As a starting point, it is helpful to know how many utterances we have, how many unique children are present, the total audio time, the distribution of audio clip durations, and the distribution of child ages.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;read_transcripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Read JSONL transcript file into a DataFrame and convert audio paths to absolute paths.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;transcript_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;train_word_transcripts.jsonl&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcript_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Loaded &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; utterance transcripts&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_relpath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_relpath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df_dd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_transcripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;raw&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;drivendata&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df_tb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_transcripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;raw&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;talkbank&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;df_dd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;df_tb&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;ignore_index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stderr output_text"&gt;
&lt;pre&gt;&lt;span class="ansi-green-fg"&gt;2026-02-26 04:58:21.910&lt;/span&gt; | &lt;span class="ansi-bold"&gt;INFO    &lt;/span&gt; | &lt;span class="ansi-cyan-fg"&gt;__main__&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;read_transcripts&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;5&lt;/span&gt; - &lt;span class="ansi-bold"&gt;Loaded 95572 utterance transcripts&lt;/span&gt;
&lt;span class="ansi-green-fg"&gt;2026-02-26 04:58:24.452&lt;/span&gt; | &lt;span class="ansi-bold"&gt;INFO    &lt;/span&gt; | &lt;span class="ansi-cyan-fg"&gt;__main__&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;read_transcripts&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;5&lt;/span&gt; - &lt;span class="ansi-bold"&gt;Loaded 255046 utterance transcripts&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[4]:&lt;/div&gt;



&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;utterance_id&lt;/th&gt;
      &lt;th&gt;child_id&lt;/th&gt;
      &lt;th&gt;session_id&lt;/th&gt;
      &lt;th&gt;audio_duration_sec&lt;/th&gt;
      &lt;th&gt;age_bucket&lt;/th&gt;
      &lt;th&gt;md5_hash&lt;/th&gt;
      &lt;th&gt;filesize_bytes&lt;/th&gt;
      &lt;th&gt;orthographic_text&lt;/th&gt;
      &lt;th&gt;audio_relpath&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;td&gt;U_00003c3ae1c35c6f&lt;/td&gt;
      &lt;td&gt;C_c74bfde2cca8d5da&lt;/td&gt;
      &lt;td&gt;S_7d821c3e4d3bc616&lt;/td&gt;
      &lt;td&gt;1.920&lt;/td&gt;
      &lt;td&gt;8-11&lt;/td&gt;
      &lt;td&gt;9214be45ba2928dd57384f3c7ee54236&lt;/td&gt;
      &lt;td&gt;30672&lt;/td&gt;
      &lt;td&gt;hm&lt;/td&gt;
      &lt;td&gt;audio/U_00003c3ae1c35c6f.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;td&gt;U_00003db24218ffe4&lt;/td&gt;
      &lt;td&gt;C_c74bfde2cca8d5da&lt;/td&gt;
      &lt;td&gt;S_e6103ab3a4538d71&lt;/td&gt;
      &lt;td&gt;12.737&lt;/td&gt;
      &lt;td&gt;8-11&lt;/td&gt;
      &lt;td&gt;fe761bb3d034530ef05163c7ad98ec3e&lt;/td&gt;
      &lt;td&gt;180942&lt;/td&gt;
      &lt;td&gt;yeah its pouring the water on the screen but t...&lt;/td&gt;
      &lt;td&gt;audio/U_00003db24218ffe4.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;td&gt;U_0001a0d0a3b4d816&lt;/td&gt;
      &lt;td&gt;C_4d0e1c16566d65a2&lt;/td&gt;
      &lt;td&gt;S_179057c3c3ccdecf&lt;/td&gt;
      &lt;td&gt;11.556&lt;/td&gt;
      &lt;td&gt;8-11&lt;/td&gt;
      &lt;td&gt;b05073e65a98368fccbe777b5ab35e02&lt;/td&gt;
      &lt;td&gt;208352&lt;/td&gt;
      &lt;td&gt;it got water and sunlight but the plant did di...&lt;/td&gt;
      &lt;td&gt;audio/U_0001a0d0a3b4d816.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;3&lt;/th&gt;
      &lt;td&gt;U_00021d201a31d313&lt;/td&gt;
      &lt;td&gt;C_3b51c8b1d2c076d8&lt;/td&gt;
      &lt;td&gt;S_90720887e4430996&lt;/td&gt;
      &lt;td&gt;1.125&lt;/td&gt;
      &lt;td&gt;8-11&lt;/td&gt;
      &lt;td&gt;9ed95318724ae6a2d1ce95d6aa743f6b&lt;/td&gt;
      &lt;td&gt;27099&lt;/td&gt;
      &lt;td&gt;there is wires&lt;/td&gt;
      &lt;td&gt;audio/U_00021d201a31d313.flac&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;4&lt;/th&gt;
      &lt;td&gt;U_0003537f2bc1eb0b&lt;/td&gt;
      &lt;td&gt;C_b50216b3c70ca0a2&lt;/td&gt;
      &lt;td&gt;S_5b0bb48fadd7f802&lt;/td&gt;
      &lt;td&gt;1.125&lt;/td&gt;
      &lt;td&gt;8-11&lt;/td&gt;
      &lt;td&gt;f3142751c6a52e2c24a85a4544fe8a0f&lt;/td&gt;
      &lt;td&gt;18476&lt;/td&gt;
      &lt;td&gt;good&lt;/td&gt;
      &lt;td&gt;audio/U_0003537f2bc1eb0b.flac&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utterance_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nunique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[5]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;350618&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;child_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nunique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;3344&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;audio_duration_sec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[7]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;344&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;There are over 350,000 utterances in the training dataset, across 3,344 children, totaling 344 hours of audio data. Next, let's take a look at the distribution of audio clip durations.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inf&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;20+&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;binned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;audio_duration_sec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binned&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Audio Duration (sec)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Number of Audio Clips&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Distribution of Audio Durations&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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8D5VREREukfn71NFREREpEsYqoiIiIhkwFBFREREJAOGKiIiIiIZMFQRERERyYChioiIiEgGDFVEREREMmCoIiIiIpIBQxURERGRDBiqiIiIiGTAUEVEREQkA4YqIiIiIhkwVBERERHJgKGKiIiISAYMVUREREQyYKgiIiIikgFDFREREZEMGKqIiIiIZMBQRURERCQDhioiIiIiGTBUEREREcmAoYqIiIhIBgxVRERERDJgqCIiIiKSAUMVERERkQwYqoiIiIhkwFBFREREJAOGKiIiIiIZMFQRERERyYChioiIiEgGDFVEREREMmCoIiIiIpIBQxURERGRDBiqiIiIiGTAUEVEREQkA4YqIiIiIhkYlHcB9IzjpH0ajU+c61dGlRAREZE2uKeKiIiISAYMVUREREQyYKgiIiIikgFDFREREZEMGKqIiIiIZMBQRURERCQDhioiIiIiGTBUEREREcmAoYqIiIhIBgxVRERERDJgqCIiIiKSAUMVERERkQwYqoiIiIhkwFBFREREJAOGKiIiIiIZMFQRERERyYChioiIiEgGDFVEREREMmCoIiIiIpJBhQ5V+fn5+Oqrr+Dk5ARTU1PUrl0b33zzDYQQ0hghBKZNmwY7OzuYmprCx8cH8fHxKvOkpaWhb9++sLCwgJWVFYKCgvDo0SOVMRcuXECbNm1gYmICe3t7zJ8/v0g927ZtQ926dWFiYoIGDRrgjz/+KJsNJyIiIp1ToUPVvHnzsHLlSqxYsQKxsbGYN28e5s+fj+XLl0tj5s+fj2XLlmHVqlWIiopC5cqV4evri6dPn0pj+vbti8uXLyM8PBx79+7FsWPHMHToUKk/MzMTHTt2hIODA6Kjo7FgwQLMmDEDq1evlsacPHkSffr0QVBQEP766y/4+/vD398fly5dej0vBhEREVVoCvH8bp8KpkuXLrCxscGaNWukth49esDU1BQbNmyAEAJKpRLjxo3DF198AQDIyMiAjY0NQkJCEBAQgNjYWLi5ueHMmTNo2rQpACAsLAydO3fG33//DaVSiZUrV2Lq1KlITk6GkZERAGDSpEnYtWsXrl69CgDo3bs3srKysHfvXqmWFi1awN3dHatWrVJrezIzM2FpaYmMjAxYWFio9DlO2qfRa5M410/tsWU5NxER0ZvuZZ/fz6vQe6patmyJiIgIXLt2DQBw/vx5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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Even though the audio has been clipped to the utterance level, we have some outliers over 20 seconds.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# What is the longest clip (in minutes)?&lt;/span&gt;
&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;audio_duration_sec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[9]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;22&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Most audio clips are very short (1-3 seconds). There is a tail of longer clips, up to an outlier 22 minute clip. Next, let's look at the distribution of utterances by child age.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;age_bucket&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Categorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;age_bucket&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;unknown&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;3-4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;5-7&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;8-11&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;12+&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;ordered&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;age_bucket&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normalize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;barh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Utterances by Age Group&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Percent of Utterances&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Age Group&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PercentFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.0f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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eYEAAAC5SabD2YABAxQbG6uYmBjlzZvX3t6sWTN9//33WVocAABAbpPhh9DeEB0dre+//15169aVzWaztwcHB2v//v1ZWhwAAEBuk+mZs1OnTt30d0pevHjRIawBAAAg8zIdzmrWrKmff/7ZvnwjkH399deqV69e1lUGAACQC2X6tOZHH32kli1bateuXbp27Zo+++wz7dq1S2vWrNHy5cvvR40AAAC5xl39bs39+/dr5MiRio2N1YULF/TII4/o3XffVZUqVe5HjblOVv1uLgAAkH2y6vubX3xuQYQzAAAePFn1/Z3p05pJSUk3bbfZbHJzc5Orq+tdFwMAAJDbZTqceXl53fauzJIlS6pbt24aPHiwnJz47VAAAACZkelwNm3aNL3//vvq1q2bateuLUlav369pk+frg8++ECnTp3SmDFj5Obmpv/+979ZXjAAAMC/WabD2fTp0zV27Fi1b9/e3hYaGqoqVaroyy+/1JIlS+Tv76/hw4cTzgAAADIp0+cd16xZo+rVq6drr169utauXStJatiwof13bgIAACDjMh3O/Pz8NHXq1HTtU6dOlZ+fnyTpr7/+UqFChe69OgAAgFwm06c1x4wZo2effVYLFixQrVq1JEkbN27Unj179MMPP0iSNmzYoOeeey5rKwUAAMgF7uo5ZwcOHNCXX36puLg4SVKFChX02muvqXTp0lldX67Ec84AAHjwWPIhtDt27FDlypWzane5FuEMAIAHT1Z9f9/zg8jOnz+vKVOmqHbt2qpWrdq97g4AACBXu+twtmLFCnXt2lUlSpTQmDFj1KRJE/3+++9ZWRsAAECuk6kbAo4fP65p06Zp6tSpSkpKUvv27ZWcnKzo6GhVqlTpftUIAACQa2R45iw0NFQVKlTQtm3b9Omnn+rYsWMaP378/awNAAAg18nwzNmCBQvUt29f9ezZU+XLl7+fNQEAAORaGZ45W7Vqlc6fP68aNWqoTp06mjBhgk6fPn0/awMAAMh1MhzO6tatq6+++koJCQl67bXXNHPmTPn6+iotLU2LFi3S+fPn72edAAAAucI9PecsLi5OU6dO1TfffKNz587p8ccf17x587KyvlyJ55wBAPDgscRzzipUqKCPP/5YR44c0XfffXcvuwIAAICy+DcEIGswcwYAwIPHEjNnAAAAyFqEMwAAAAshnAEAAFgI4QwA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nNzyZ3q7AyNb3YdqAABAdmDmDAAAwEIIZwAAABZCOAMAALAQwhkAAICFEM4AAAAshHAGAABgIYQzAAAACyGcAQAAWAjhDAAAwEIIZwAAABZCOAMAALAQwhkAAICFPNDhLCYmRjabTefOncvpUixnxIgRqlWrlgoWLCgfHx+1bdtWcXFxDn3efPNNFS5cWH5+foqMjHRYN2vWLIWGhmZnyQAAQA94OMOtLV++XGFhYfr999+1aNEipaSkqHnz5rp48aIk6aefftKMGTP022+/6eOPP9bLL7+s06dPS5ISExP1/vvva+LEiTl5CAAA5Ep5croA3B+//vqrw/K0adPk4+OjTZs26dFHH9Xu3bsVEhKimjVrqmbNmurXr5/i4+NVtGhRvfPOO+rZs6f8/f1zqHoAAHKvHJ05K126tD799FOHtocffljh4eGSJJvNpq+//lrt2rVT/vz5Vb58ec2bN++W+7t06ZJatmypBg0a6Ny5czpw4IBsNpvmzJmjxx57TPnz51e1atW0du1ah+1mz56t4OBgubm5qXTp0ho7dqx93YQJE1S5cmX7cnR0tGw2myZPnmxva9asmT744ANJUnh4uB5++GF98803Kl26tDw9PfX888/r/PnzdztMWSIxMVGSVLhwYUlStWrVtHHjRp09e1abNm3S5cuXFRAQoFWrVmnz5s3q27dvTpYLAECuZfnTmkOGDFH79u21bds2Pfnkk+rUqZPOnDmTrt+5c+f0+OOPKy0tTYsWLZKXl5d93fvvv6/+/ftr69atCgwMVIcOHXTt2jVJ0qZNm9S+fXs9//zz2r59u8LDwzVw4EBNmzZNktS4cWPt2rVLp06dknT9dGHRokUVExMjSUpJSdHatWsVEhJif7/9+/crOjpa8+fP1/z587V8+XKNHDnyvoxPRqSlpalfv35q0KCBPWi2aNFCL7zwgmrVqqVu3bpp+vTpcnd3V8+ePTV58mRNmjRJFSpUUIMGDbRz584cqx0AgNzG8uGsW7du6tChgwICAvTRRx/pwoULWr9+vUOf48ePq3HjxipRooR++ukn5c+f32F9//791apVKwUGBmrIkCE6ePCg9u3bJ0kaN26cmjZtqoEDByowMFDdunVT7969NXr0aElS5cqVVbhwYS1fvlzS9ZsQ3nrrLfvy+vXrlZKSovr169vfLy0tTdOmTVPlypXV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ve77MT0o3nvvPbN8+XITHx9vtm3bZt577z1js9nMb7/9Zoxh3LPb3685M4bxv5/eeustExMTY+Lj483q1atNs2bNTNGiRe132D9IY084yyHjx483/v7+xtXV1dSuXdv8/vvvDuuPHz9uSpUqZY4ePerQPmTIEFO4cGETFBRk1q1bl50lP5CWLVtmJKV7de3a1Rhz/XEaAwcONMWKFTNubm6madOmJi4uLt1+tm/fbgICAhye05Wammp69uxpPDw8TK1atcwff/yRXYdleTcbc0kmIiLC3ufy5cumV69eplChQiZ//vymXbt2JiEhId2+fv31V1O7dm2Tmppqb7t48aJ59tlnTcGCBU3Tpk3NiRMnsuOwHggvvviiKVWqlHF1dTXe3t6madOm9mBmDOOe3f4Zzhj/++e5554zJUqUMK6uruahhx4yzz33nNm3b599/YM09jZjjLm/c3MAAADIKK45AwAAsBDCGQAAgIUQzgAAACyEcAYAAGAhhDMAAAALIZwBAABYCOEMAADAQghnAJDFwsPDVaxYMdlsNkVHR+d0OQAeMIQzAFmmW7dustlsstls9l++PXToUF27di2nS7ujrApSu3fv1pAhQ/Tll18qISFBLVu2TNcnJiZGNpst3S9hlqTSpUvr008/lSQdOHBANptNW7dudejTrVs3tW3b9p5rBWBNeXK6AAD/Lk888YQiIiKUnJysX375RWFhYXJxcdGAAQMyva/U1FTZbDY5OT04/47cv3+/JKlNmzay2Ww5XM3tXb16Va6urjldBoB/eHD+xgPwQHBzc1Px4sVVqlQp9ezZU82aNdO8efMkScnJyerfv78eeughubu7q06dOoqJibFvO23aNHl5eWnevHmqVKmS3NzcdOjQISUnJ+vdd9+Vn5+f3NzcFBAQoKlTp9q327Fjh1q2bKkCBQqoWLFi6ty5s06fPm1fHxISor59++qdd95R4cKFVbx4cYWHh9vXly5dWpLUrl072Ww2+/LNbN++XU2aNFG+fPlUpEgRvfrqq7pw4YKk66czQ0NDJUlOTk73HM7KlCkjSapevbpsNptCQkIUHh6u6dOn68cff7TPUt4Yw8OHD6t9+/by8vJS4cKF1aZNGx04cMC+vxszbsOHD5evr68qVKggSfrmm29Us2ZNFSxYUMWLF1fHjh118uRJ+3Y3ZvqWLFmimjVr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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;About half of the utterances come from 8 to 11 year olds, with 13% coming from 3 to 4 year olds and 28% coming from 5 to 7 year olds.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Let&amp;#8217;s-explore-the-utterances!"&gt;Let&amp;#8217;s explore the utterances!&lt;a class="anchor-link" href="#Let&amp;#8217;s-explore-the-utterances!"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We will listen to an example utterance and visualize the features.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;plot_waveform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Plot the waveform of an audio signal&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;waveshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Waveform&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Time (s)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Amplitude&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;plot_melspectrogram&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Generate and plot the mel spectrogram of an audio signal&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;melspectrogram&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;S_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power_to_db&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;specshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorbar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%+2.0f&lt;/span&gt;&lt;span class="s2"&gt; dB&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mel Spectrogram&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Time (s)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mel Frequency&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[13]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;example_utt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;U_1c8757065e355c35&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utterance_id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;example_utt&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utterance_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;audio_duration_sec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;orthographic_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[13]:&lt;/div&gt;



&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;utterance_id&lt;/th&gt;
      &lt;th&gt;audio_duration_sec&lt;/th&gt;
      &lt;th&gt;orthographic_text&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;124170&lt;/th&gt;
      &lt;td&gt;U_1c8757065e355c35&lt;/td&gt;
      &lt;td&gt;0.516&lt;/td&gt;
      &lt;td&gt;yeah&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;audio controls src="../audio/gates_asr_U_1c8757065e355c35.flac"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;This clip may sound understandable to us, but children’s speech often includes subtle pronunciation differences. For example, models must learn to handle syllable deletions (“elephant” → “efant”), consonant nasalization (“mom” → “bob”), and common &lt;a href="https://en.wikipedia.org/wiki/Speech_sound_disorder"&gt;speech sound disorders&lt;/a&gt; like tetism.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now that we've heard the utterance, let's look at it from the model's perspective. We'll plot the raw waveform - the audio signal represented as amplitude over time:&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utterance_id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;example_utt&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;plot_waveform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2sAAAGJCAYAAAAUpqswAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgzdJREFUeJzt3Xd4U2X7B/BvRpN070GhtJRVQGRPZQgVEBRxoi8q+CpOVER9BV9F1FdBRUURRRFcPxUc4BYHQwSRvfcqFEpb2tK90uT8/khympOcNmmb2X4/19WL5uTJOU8OaU7uPM9z3wpBEAQQERERERGRT1F6uwNERERERERkj8EaERERERGRD2KwRkRERERE5IMYrBEREREREfkgBmtEREREREQ+iMEaERERERGRD2KwRkRERERE5IMYrBEREREREfkgBmtEREREREQ+iMEaERFRE3z66adIS0tDQEAAIiIivN0dIiJqRhisERGR13355ZdQKBRYtWqV3X09evSAQqHAunXr7O5r27YtBg8e7Ikuyjp8+DCmTJmC9u3bY8mSJXj//fe91hciImp+GKwREZHXXX755QCAjRs3SrYXFxdj//79UKvV2LRpk+S+zMxMZGZmio/1hvXr18NoNOLNN9/ElClTcPPNN3utL0RE1PwwWCMiIq9LTExEu3bt7IK1zZs3QxAE3HTTTXb3WW57M1jLzc0FAJdOfywvL3fZvoiIyL8xWCMiIp9w+eWXY9euXaioqBC3bdq0Cd26dcNVV12Ff/75B0ajUXKfQqHAZZddhg8//BAjRoxAXFwctFotunbtinfffVey/6uvvhqpqamyxx40aBD69u0r2fZ///d/6NOnDwIDAxEVFYVbbrkFmZmZ4v0pKSl49tlnAQCxsbFQKBSYM2eOeP8777yDbt26QavVIjExEQ8++CAKCwslxxg+fDguueQS7NixA0OHDkVQUBCeeuopZGRkQKFQYP78+Vi0aBFSU1MRFBSEUaNGITMzE4Ig4IUXXkCbNm0QGBiIa6+9FgUFBQ0630RE5PsYrBERkU+4/PLLodfrsWXLFnHbpk2bMHjwYAwePBhFRUXYv3+/5L60tDRER0fj3XffRXJyMp566im89tprSEpKwgMPPIBFixaJ7SdOnIhTp05h27ZtkuOePn0a//zzD2655RZx24svvog77rgDHTt2xOuvv47p06djzZo1GDp0qBhwLViwANdddx0A4N1338Wnn36K66+/HgAwZ84cPPjgg0hMTMRrr72GG264Ae+99x5GjRoFvV4vOX5+fj6uuuoq9OzZEwsWLMAVV1wh3vfZZ5/hnXfewUMPPYTHHnsMf/75J26++WY8/fTTWL16NZ588kncc889+OGHH/D444838X+AiIh8jkBEROQDDhw4IAAQXnjhBUEQBEGv1wvBwcHCxx9/LAiCIMTHxwuLFi0SBEEQiouLBZVKJUydOlUQBEEoLy+329/o0aOF1NRU8XZRUZGg1WqFxx57TNLulVdeERQKhXD69GlBEAQhIyNDUKlUwosvvihpt2/fPkGtVku2P/vsswIA4cKFC+K23NxcQaPRCKNGjRIMBoO4/e233xYACMuWLRO3DRs2TAAgLF68WHKsU6dOCQCE2NhYobCwUNw+a9YsAYDQo0cPQa/Xi9tvvfVWQaPRCJWVlfYnloiI/BZH1oiIyCd06dIF0dHR4lq0PXv2oKysTMz2OHjwYDHJyObNm2EwGMT1aoGBgeJ+ioqKkJeXh2HDhuHkyZMoKioCAISFheGqq67Cl19+CUEQxPYrVqzAwIED0bZtWwDAypUrYTQacfPNNyMvL0/8SUhIQMeOHWWzUlr7448/UF1djenTp0OprL3MTp06FWFhYfjpp58k7bVaLe68807Zfd10000IDw8Xbw8YMAAAcNttt0GtVku2V1dX49y5c/X2jYiI/AuDNSIi8gkKhQKDBw8W16Zt2rQJcXFx6NChAwBpsGb51xKsbdq0Cenp6QgODkZERARiY2Px1FNPAYAYrAGmqZCZmZnYvHkzAODEiRPYsWMHJk6cKLY5duwYBEFAx44dERsbK/k5dOiQmFSkLqdPnwYAdO7cWbJdo9EgNTVVvN+idevW0Gg0svuyBJAWlsAtKSlJdvvFixfr7RsREfkXteMmREREnnH55Zfjhx9+wL59+8T1ahaDBw/GE088gXPnzmHjxo1ITExEamoqTpw4gZEjRyItLQ2vv/46kpKSoNFo8PPPP+ONN96QJCW55pprEBQUhC+//BKDBw/Gl19+CaVSiZtuuklsYzQaoVAo8Msvv0ClUtn1MSQkxKXP2XpU0Jbc8evbbj1iSERE/o/BGhER+QzremubNm3C9OnTxfv69OkDrVaL9evXY8uWLRg7diwA4IcffkBVVRW+//57yUiU3HTF4OBgXH311fjqq6/w+uuvY8WKFRgyZAgSExPFNu3bt4cgCGjXrh06derU4OeQnJwMADhy5Igk+2R1dTVOnTqF9PT0Bu+TiIhaJk6DJCIin9G3b1/odDp89tlnOHfunGRkTavVonfv3li0aBHKysrEwM4yymQ9qlRUVIQPP/xQ9hgTJ05EVlYWPvjgA+zZs0cyBRIArr/+eqhUKjz33HN2I1WCICA/P7/e55Ceng6NRoO33npL8vilS5eiqKgI48aNc+JMEBERcWSNiIh8iEajQb9+/fDXX39Bq9WiT58+kvsHDx6M1157DUDtKNyoUaOg0WhwzTXX4N5770VpaSmWLFmCuLg4nD9/3u4YY8eORWhoKB5//HGoVCrccMMNkvvbt2+P//3vf5g1axYyMjIwYcIEhIaG4tSpU1i1ahXuueeeetPkx8bGYtasWXjuuecwZswYjB8/HkeOHME777yDfv364bbbbmvqaSIiohaCI2tERORTLEGYZdqjtcsuuwwAEBoaih49egAwJfL4+uuvoVAo8Pjjj2Px4sW455578Mgjj8juX6fTYfz48SgpKcEVV1yBuLg4uzYzZ87EN998A6VSieeeew6PP/44vv/+e4waNQrjx493+BzmzJmDt99+G2fOnMGjjz6KL7/8Evfccw9+++03BAQENOh8EBFRy6UQuBqZiIiIiIjI53BkjYiIiIiIyAcxWCMiIiIiIvJBDNaIiIiIiIh8EIM1IiIiIiIiH8RgjYiIiIiIyAcxWCMiIiIiIvJBLIrtgNFoRFZWFkJDQ6FQKLzdHSIiIiIi8hJBEFBSUoLExEQole4f92Kw5kBWVhaSkpK83Q0iIiIiIvIRmZmZaNOmjduPw2DNgdDQUACm/5CwsDAv94aIiIiIiLyluLgYSUlJYozgbgzWHLBMfQwLC2OwRkREREREHlsexQQjREREREREPojBGhERERERkQ9isEZEREREROSDGKwRERERERH5IAZrREREREREPojBGhERERERkQ9isEZEREREROSDGKwRERERERH5IAZrREREREREPojBGhERERERkQ9isEZELc6R7BL8fTzP290gIiIiqheDNSJqca57ZxP+9cEWbDzGgI2IiIh8F4M1ImpxyqsNAIDblm7BmfxyL/eGiIiISB6DNSJq0YyC4O0u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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Before training a machine learning model, the raw audio array with sampled amplitudes must be transformed. Transforming this raw signal into mel spectrograms enables the machine learning model to learn speech-relevant acoustic patterns more efficiently. The transformation reorganizes the signal into a structured time-by-frequency map that highlights speech patterns like vowels and consonants.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[16]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plot_melspectrogram&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAy0AAAGJCAYAAACHAtzXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAlRZJREFUeJzt3Xl4FFXWBvC3es8ekgBJIOyrCIgBMSiLEiGIooI6IIOAGcAZQJEZdJBREBFc+AREBRdEnWFRHHBcBhQBEZVFQXBhRzZDQoCQPemt7vdHJq1tAnQ3yaFJ3p9PP5JKdZ3qSnV137rnnqsppRSIiIiIiIiClOFS7wAREREREdH5sNFCRERERERBjY0WIiIiIiIKamy0EBERERFRUGOjhYiIiIiIghobLUREREREFNTYaCEiIiIioqDGRgsREREREQU1NlqIiIiIiCiosdFCRFRFevXqhV69el3q3SAiIqpx2GgholrhzTffhKZp0DQNX375ZYXfK6WQlJQETdNwyy23VOu+OBwOzJs3D506dUJkZCSio6PRrl07jB49Gnv37q3W2L7473//i2nTpl3q3SAiIvJgo4WIahWbzYalS5dWWL5x40b88ssvsFqt1b4PgwYNwl//+ldceeWVePrpp/HEE0+gR48eWL16NbZs2VLt8S/kv//9L5544olLvRtEREQepku9A0REkm6++WasWLECL7zwAkymXy+BS5cuRXJyMk6fPl2t8b/55ht89NFHeOqpp/Doo496/e7FF19Ebm5utcavai6XC7quw2KxVHssXdfhcDhgs9mqPRYREQUX9rQQUa0yZMgQnDlzBmvXrvUsczgceO+993DPPfdU+hxd1zF37ly0a9cONpsN9evXx5gxY3D27Fm/4x86dAgAcN1111X4ndFoRGxsrOfnadOmQdM07N27F3fffTciIyMRGxuLBx98EKWlpRWe/69//QvJyckICQlBTEwMBg8ejOPHj1dYb+vWrbj55ptRp04dhIWFoUOHDpg3bx4AYMSIEXjppZcAwJNOp2kaAODIkSPQNA2zZ8/G3Llz0bx5c1itVuzevRsAsH79enTv3h1hYWGIjo7Gbbfdhj179lSI//nnn6Nz586w2Wxo3rw5XnnlFc9r/S1N0zBu3DgsWbIE7dq1g9VqxZo1awAAs2fPRrdu3RAbG4uQkBAkJyfjvffeqxCrfBsrVqzAFVdcgZCQEKSkpOCHH34AALzyyito0aIFbDYbevXqhSNHjlTYBhERXXrsaSGiWqVJkyZISUnBsmXL0K9fPwDA6tWrkZeXh8GDB+OFF16o8JwxY8bgzTffxMiRI/HAAw/g8OHDePHFF/Hdd9/hq6++gtls9jl+48aNAQBLlizBdddd59Xbcy533303mjRpglmzZmHLli144YUXcPbsWbz99tuedZ566ik89thjuPvuu/GnP/0Jp06dwvz589GjRw989913iI6OBgCsXbsWt9xyCxISEvDggw8iPj4ee/bswUcffYQHH3wQY8aMwYkTJ7B27Vr885//rHR/Fi9ejNLSUowePRpWqxUxMTH47LPP0K9fPzRr1gzTpk1DSUkJ5s+fj+uuuw47duxAkyZNAADfffcd0tLSkJCQgCeeeAJutxvTp09H3bp1K421fv16vPvuuxg3bhzi4uI825k3bx4GDBiAoUOHwuFwYPny5bjrrrvw0UcfoX///l7b2LRpEz744AOMHTsWADBr1izccsstePjhh/Hyyy/jL3/5C86ePYtnn30W9913H9avX3/BvwkREQlTRES1wOLFixUA9c0336gXX3xRRUREqOLiYqWUUnfddZe64YYblFJKNW7cWPXv39/zvE2bNikAasmSJV7bW7NmTYXlPXv2VD179jzvfui6rnr27KkAqPr166shQ4aol156SR09erTCulOnTlUA1IABA7yW/+Uvf1EA1K5du5RSSh05ckQZjUb11FNPea33ww8/KJPJ5FnucrlU06ZNVePGjdXZs2cr7Fe5sWPHqso+Hg4fPqwAqMjISJWdne31u6uuukrVq1dPnTlzxrNs165dymAwqHvvvdez7NZbb1WhoaEqIyPDs+zAgQPKZDJViAlAGQwG9dNPP1XYl/K/XTmHw6GuvPJKdeONN1bYhtVqVYcPH/Yse+WVVxQAFR8fr/Lz8z3LJ0+erAB4rUtERMGB6WFEVOvcfffdKCkpwUcffYSCggJ89NFH50wNW7FiBaKionDTTTfh9OnTnkdycjLCw8OxYcMGv2JrmoZPPvkEM2bMQJ06dbBs2TKMHTsWjRs3xh/+8IdKx7SU9xCUGz9+PICyAfMAsHLlSui6jrvvvttrH+Pj49GyZUvPPn733Xc4fPgwJkyY4Ol5+e1++WrQoEFePSOZmZnYuXMnRowYgZiYGM/yDh064KabbvLsp9vtxmeffYbbb78diYmJnvVatGjh6fX6vZ49e+KKK66osDwkJMTz77NnzyIvLw/du3fHjh07Kqzbu3dvTw8NAHTt2tXzOiIiIios//nnn8/7+omISB7Tw4io1qlbty5SU1OxdOlSFBcXw+12484776x03QMHDiAvLw/16tWr9PfZ2dl+x7darZgyZQqmTJmCzMxMbNy4EfPmzcO7774Ls9mMf/3rX17rt2zZ0uvn5s2bw2AweMZfHDhwAEqpCuuVK09fKx9Pc+WVV/q9z7/VtGlTr5+PHj0KAGjdunWFddu2bYtPPvkERUVFyM/PR0lJCVq0aFFhvcqWVRar3EcffYQZM2Zg586dsNvtnuWVNb4aNWrk9XNUVBQAICkpqdLlgYxVIiKi6sVGCxHVSvfccw9GjRqFrKws9OvXr0LPQzld11GvXj0sWbKk0t+fayyGrxISEjB48GAMGjQI7dq1w7vvvos333zzvGNdfv/FXNd1aJqG1atXw2g0Vlg/PDz8ovbx937by1HdKou1adMmDBgwAD169MDLL7+MhIQEmM1mLF68uNJy1pUdk/MtV0pd3E4TEVGVY6OFiGqlO+64A2PGjMGWLVvwzjvvnHO95s2b47PPPsN1111XrV/WzWYzOnTogAMHDnhSu8odOHDAq8fh4MGD0HXdk/LUvHlzKKXQtGlTtGrV6ryvBQB+/PFHpKamnnM9f1LFgF+LC+zbt6/C7/bu3Yu4uDiEhYXBZrPBZrPh4MGDFdarbNm5/Pvf/4bNZsMnn3ziNa/O4sWL/dpvIiK6fHBMCxHVSuHh4ViwYAGmTZuGW2+99Zzr3X333XC73XjyyScr/M7lcvk9r8qBAwdw7NixCstzc3OxefNm1KlTp0LvTXkJ4nLz588HAM84kIEDB8JoNOKJJ56o0EuglMKZM2cAAFdffTWaNm2KuXPnVtjv3z4vLCzMs0++SEhIwFVXXYW33nrL6zk//vgjPv30U9x8880Ayno2UlNT8f777+PEiROe9Q4ePIjVq1f7FKt8O5qmwe12e5YdOXIE77//vs/bICKiywt7Woio1ho+fPgF1+nZsyfGjBmDWbNmYefOnejTpw/MZjMOHDiAFStWYN68eeccD1OZXbt24Z577kG/fv3QvXt3xMTEICMjA2+99RZOnDiBuXPnVkhbOnz4MAYMGIC0tDRs3rwZ//rXv3DPPfegY8eOAMp6UGbMmIHJkyfjyJEjuP322xEREYHDhw9j1apVGD16NP72t7/BYDBgwYIFuPXWW3HVVVdh5MiRSEhIwN69e/HTTz/hk08+AQAkJycDAB544AH07dsXRqMRgwcPPu/reu6559CvXz+kpKQgPT3dU/I4KioK06ZN86w3bdo0fPrpp7juuuvw5z//GW63Gy+++CKuvPJK7Ny506dj2L9/fzz//PNIS0vDPffcg+zsbLz00kto0aIFvv/+ex//EkREdFm5lKXLiIik/Lbk8fn8vuRxuVdffVUlJyerkJAQFRERodq3b68efvhhdeLECc86vpQ8PnnypHr66adVz549VUJCgjKZTKpOnTrqxhtvVO+9957XuuUlj3fv3q3uvPNOFRERoerUqaPGjRunSkpKKmz73//+t7r++utVWFiYCgsLU23atFFjx45V+/bt81rvyy+/VDfddJOKiIhQYWFhqkOHDmr+/Pme37tcLjV+/HhVt25dpWmapxRxecnj5557rtLX9tlnn6nrrrtOhYSEqMjISHXrrbeq3bt3V1hv3bp1qlOnTspisajmzZur119/Xf31r39VNpvNaz0AauzYsZXGWrRokWrZsqWyWq2qTZs2avHixZ7jdaFtnOt1bNiwQQFQK1asqDQmERFdOppSHHFIRBSMpk2bhieeeAKnTp1CXFzcpd6danX77bfjp59+woEDBy71rhARURDimBYiIhJVUlLi9fOBAwfw3//+F7169bo0O0REREGPY1qIiEhUs2bNMGLECDRr1gxHjx7FggULYLFY8PDDD1/qXSMioiDFRgsREYlKS0vDsmXLkJWVBavVipSUFMycOfOck2MSERFxTAsREREREQU1jmkhIiIiIqKgxkYLEREREREFNY5p8ZGu6zhx4gQiIiKgadql3h0iIiIi+h2lFAoKCpCYmAiDIbjuzZeWlsLhcAT8fIvFApvNVoV7dHlho8VHJ06cQFJS0qXeDSIiIiK6gOPHj6Nhw4aXejc8SktL0bRpA2Rl5QS8jfj4eBw+fLjWNlzYaPFRRETE//5lAMCeFiIiIqLgowDov/neFhwcDgeysnJw5PByREaG+v38/PxiNGk6GA6Hg40WOr9fU8I0sNFCREREFLyCNZU/MtyGyPAQ/5+o61W/M5cZNlqIiIiIiCToemANEDZaWD2MiIiIiIiCG3taiIiIiIgkKFX2COR5tRwbLUREREREEnQVYHoYGy1stBARERERSeCYloCx0UJEREREJIGNloCx0UJEREREJIGNloCxehgREREREQU19rQQEREREUlQAfa0KPa0sNFCRERERCRAUzq0ABoggTynpmGjhYiIiIhIAse0BIyNFiIiIiIiCboKbM4VztPCRgsRERERkQj2tASM1cOIiIiIiCiosaeFiIiIiEgCe1oCxkYLEREREZEEpQIrX6w4poWNFiIiIiIiCexpCRgbLUREREREElg9LGCXdCC+2+3GY489hqZNmyIkJATNmzfHk08+CfWbLrCVK1eiT58+iI2NhaZp2LlzZ4XtHDp0CHfccQfq1q2LyMhI3H333Th58qTn90eOHEF6erpXnKlTp8LhcEi8TCIiIiKiX3taAnnUcpe00fLMM89gwYIFePHFF7Fnzx4888wzePbZZzF//nzPOkVFRbj++uvxzDPPVLqNoqIi9OnTB5qmYf369fjqq6/gcDhw6623Qv/fH3jv3r3QdR2vvPIKfvrpJ8yZMwcLFy7Eo48+KvI6iYiIiIgocJc0Pezrr7/Gbbfdhv79+wMAmjRpgmXLlmHbtm2edYYNGwagrLekMl999RWOHDmC7777DpGRkQCAt956C3Xq1MH69euRmpqKtLQ0pKWleZ7TrFkz7Nu3DwsWLMDs2bOr6dUREREREf2GCrDXJJDB+zXMJe1p6datG9atW4f9+/cDAHbt2oUvv/wS/fr183kbdrsdmqbBarV6ltlsNhgMBnz55ZfnfF5eXh5iYmLOu938/HyvBxERERFRoDRdD/hR213SRsvf//53DB48GG3atIHZbEanTp0wYcIEDB061OdtXHvttQgLC8MjjzyC4uJiFBUV4W9/+xvcbjcyMzMrfc7Bgwcxf/58jBkz5pzbnTVrFqKiojyPpKQkv18fEREREZGHUoE/arlL2mh59913sWTJEixduhQ7duzAW2+9hdmzZ+Ott97yeRt169bFihUr8OGHHyI8PBxRUVHIzc3F1VdfDYOh4svLyMhAWloa7rrrLowaNeqc2508eTLy8vI8j+PHjwf0GomIiIiIAHAg/kW4pGNaJk2a5OltAYD27dvj6NGjmDVrFoYPH+7zdvr06YNDhw7h9OnTMJlMiI6O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j9c277//fpWUlKTWrVunvv32W3Xttdeqbt26Vfvr9ZW/x2Xbtm3qb3/7m1q2bJmKj49Xc+bMqbBO37591eLFi9WPP/6odu7cqW6++WbVqFEjVVhY6FknmI9LdRyTp556SsXGxqqPPvpIHT58WK1YsUKFh4erefPmedbx5X12Kfl7XO655x710ksvqe+++07t2bNHjRgxQkVFRalffvmlwrorV65UHTt2VImJiRWOX027tmzYsEGtXLlS7d69Wx08eFDNnTtXGY1GtWbNGs86l/s1tzqOSW283pY7fPiwatCggerevbu67bbbPMtzc3NVamqqeuedd9TevXvV5s2b1TXXXKOSk5O9nl+TzpVy5zomSik1atQo1bx5c7VhwwZ1+PBh9corryij0aj+85//eNYJ9nOFahY2Ws7hmmuuUWPHjvX87Ha7VWJiopo1a1al6999992qf//+Xsu6du2qxowZo5RSStd1FR8fr5577jnP73Nzc5XValXLli1TSim1e/duBUB98803nnVWr16tNE1TGRkZVfbaLkZVHxellPrDH/6g/vjHP54zZm5urjKbzWrFihWeZXv27FEA1ObNmwN9KVXK3+PyW40bN670C/rvZWdnKwBq48aNSqngPy7VcUz69++v7rvvPq9lAwcOVEOHDlVK+fY+u9Qu5rgopZTL5VIRERHqrbfe8lr+yy+/qAYNGqgff/yxwvGrideWynTq1En94x//UErVjGtuVR8TpWrv9dblcqlu3bqp119/XQ0fPrzCF/Tf27ZtmwKgjh49qpSqmefKhY5Ju3bt1PTp072WXX311WrKlClKqcvjXKGahelhlXA4HNi+fTtSU1M9ywwGA1JTU7F58+ZKn7N582av9QGgb9++nvUPHz6MrKwsr3WioqLQtWtXzzqbN29GdHQ0Onfu7FknNTUVBoMBW7durbLXF6jqOC66ruPjjz9Gq1at0LdvX9SrVw9du3bF+++/71l/+/btcDqdXttp06YNGjVqdM64kgI5LoHIy8sDAMTExAAI7uNSXcekW7duWLduHfbv3w8A2LVrF7788kv069cPgG/vs0upKo5LcXExnE6n5zwAyt5Hw4YNw6RJk9CuXbsKz6mJ15bfUkph3bp12LdvH3r06AHg8r/mVscxqc3X2+nTp6NevXpIT0/3KU5eXh40TUN0dDSAmnmuXOiY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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;When training machine learning models, this transformation is often handled under-the-hood by processors or feature extractors. For example, in our benchmark model implementation, we will fine tune NVIDIA’s pretrained &lt;code&gt;parakeet-tdt-0.6b-v2&lt;/code&gt; model using &lt;a href="https://docs.nvidia.com/nemo-framework/user-guide/24.09/index.html"&gt;NeMo&lt;/a&gt;. NeMo's architecture includes a built-in preprocessing pipeline that converts raw audio waveforms into mel-spectrogram features, eliminating the need for manual feature extraction.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;For more tips on generating predictive features from audio data, check out DrivenData's &lt;a href="https://drivendata.co/blog/speech-for-ml"&gt;overview&lt;/a&gt; of open-source packages for using speech data in ML. That blog post also includes some helpful intro to working with audio data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;hr&gt;
&lt;h1 id="Step-2:-Build-the-model"&gt;Step 2: Build the model&lt;a class="anchor-link" href="#Step-2:-Build-the-model"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;A straightforward modeling option is to start from a strong pretrained ASR model (trained mostly on adult speech), then fine-tune on our labeled child-speech training set. Fine-tuning the ASR model will help it understand the unique acoustic and linguistic patterns of children. Before choosing a pre-trained model, make sure it adheres to the &lt;a href="https://www.drivendata.org/competitions/308/childrens-word-asr/#external-data-and-models"&gt;competition rules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this tutorial, we adapt NVIDIA’s pretrained Parakeet TDT &lt;code&gt;parakeet-tdt-0.6b-v2&lt;/code&gt; model using NeMo. We chose this model because it is open source, ranks highly on the Hugging Face &lt;a href="https://huggingface.co/spaces/hf-audio/open_asr_leaderboard"&gt;Open ASR leaderboard&lt;/a&gt; (at time of writing), and strikes a good balance between performance and model size. Rather than fine-tuning all parameters, we will freeze the base model and train only lightweight adapter weights. &lt;strong&gt;Adapters&lt;/strong&gt; are small, trainable modules inserted into the frozen model’s layers that allow it to adapt to new data without modifying the original pretrained weights. Freezing the base model makes the fine-tuning process more efficient and helps avoid overfitting. NeMo makes this process easier by providing native adapter support, handling data pipelines (manifests, batching, feature extraction), and integrating experiment management (checkpointing, logging).&lt;/p&gt;
&lt;p&gt;Key packages include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nemo_toolkit&lt;/code&gt; for ASR model + data processing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lightning.pytorch&lt;/code&gt; for the training backend&lt;/li&gt;
&lt;li&gt;&lt;code&gt;omegaconf&lt;/code&gt; for config file management&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="1.-Prepare-Dataset-&amp;amp;-Create-Splits"&gt;1. Prepare Dataset &amp;amp; Create Splits&lt;a class="anchor-link" href="#1.-Prepare-Dataset-&amp;amp;-Create-Splits"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We need to provide NeMo with a "manifest" JSONL file that lists all of our samples and sample information. NeMo requires this manifest to be in a particular format, with specific column names and definitions. Each manifest line must be a JSON object with &lt;code&gt;audio_filepath&lt;/code&gt; (path to audio file), &lt;code&gt;duration&lt;/code&gt; (audio duration in seconds), and &lt;code&gt;text&lt;/code&gt; (transcription text).&lt;/p&gt;
&lt;p&gt;Below we will transform the competition data to NeMo's required manifest format.&lt;/p&gt;
&lt;p&gt;We'll also filter out clips longer than 25 seconds, which strain computer memory. Competitors may want to further split these clips to avoid losing training data. Then we'll split the data 80/20 into train/validation.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[17]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;MANIFEST_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DATA_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;processed&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ortho_dataset&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;train_manifest_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MANIFEST_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;train_manifest.jsonl&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;val_manifest_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MANIFEST_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;val_manifest.jsonl&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;clip_max_duration_sec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;25.0&lt;/span&gt;

&lt;span class="n"&gt;MANIFEST_DIR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Remember, &lt;code&gt;df&lt;/code&gt; has one row per utterance, and includes data hosted on both TalkBank and DrivenData.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[18]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;audio_duration_sec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;orthographic_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;audio_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;audio_filepath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;audio_duration_sec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;duration&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;orthographic_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Removing long clips to improve memory efficiency during training&lt;/span&gt;
&lt;span class="n"&gt;over_max_duration_mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;duration&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;clip_max_duration_sec&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Removing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;over_max_duration_mask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; samples with audio duration &amp;quot;&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;clip_max_duration_sec&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;over_max_duration_mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;SAMPLE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Sampling &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SAMPLE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; utterances&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SAMPLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;train_df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;train_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;train_manifest_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;records&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;val_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val_manifest_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;records&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stderr output_text"&gt;
&lt;pre&gt;&lt;span class="ansi-green-fg"&gt;2026-02-26 04:58:31.723&lt;/span&gt; | &lt;span class="ansi-bold"&gt;INFO    &lt;/span&gt; | &lt;span class="ansi-cyan-fg"&gt;__main__&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;:&lt;span class="ansi-cyan-fg"&gt;11&lt;/span&gt; - &lt;span class="ansi-bold"&gt;Removing 3849 samples with audio duration &amp;gt; 25.0 seconds&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="2.-Configuration"&gt;2. Configuration&lt;a class="anchor-link" href="#2.-Configuration"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Let's define parameters for the adaptation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To start, we copied an example .yaml file for ASR adaptation using NeMo from the &lt;a href="https://github.com/NVIDIA-NeMo/NeMo/blob/main/examples/asr/conf/asr_adapters/asr_adaptation.yaml"&gt;NeMo repository&lt;/a&gt; to &lt;code&gt;asr_benchmark/assets/asr_adaptation.yaml&lt;/code&gt;. This file gives us a reasonable default starting-point configuration.&lt;/li&gt;
&lt;li&gt;We want to overtly set some parameters, like:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pretrained_model&lt;/code&gt; (to specify &lt;code&gt;parakeet-tdt-0.6b-v2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;manifest_filepath&lt;/code&gt; (to point to our manifest locations)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;channel_selector&lt;/code&gt; (to ensure audio is converted to the expected mono format if it is stereo in raw form)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_steps&lt;/code&gt; (to control how many training steps we complete before we stop training)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For these parameters, we override the default settings in the .yaml using &lt;code&gt;OmegaConf.merge&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;While we do not implement hyperparameter tuning here, it is recommended for competitors.&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# ── Hardware-dependent settings ──────────────────────────────────────────────&lt;/span&gt;
&lt;span class="c1"&gt;# Adjust these to match your GPU memory and CPU cores.&lt;/span&gt;
&lt;span class="n"&gt;DEVICES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;PRECISION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bf16-mixed&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;BATCH_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
&lt;span class="n"&gt;NUM_WORKERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;

&lt;span class="c1"&gt;# ── Load NeMo adapter defaults ───────────────────────────────────────────────&lt;/span&gt;
&lt;span class="n"&gt;yaml_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;asr_benchmark&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;assets&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;asr_adaptation.yaml&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OmegaConf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yaml_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ── Training overrides ───────────────────────────────────────────────────────&lt;/span&gt;
&lt;span class="n"&gt;overrides&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OmegaConf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;pretrained_model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;nvidia/parakeet-tdt-0.6b-v2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;adapter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;adapter_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;asr_children_orthographic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;adapter_module_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;encoder&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;linear&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;in_features&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;train_ds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;manifest_filepath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;train_manifest_path&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;batch_size&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BATCH_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;num_workers&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NUM_WORKERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;use_lhotse&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;channel_selector&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;average&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;validation_ds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;manifest_filepath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val_manifest_path&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;batch_size&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BATCH_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;num_workers&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NUM_WORKERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;use_lhotse&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;channel_selector&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;average&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;optim&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;lr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;weight_decay&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;trainer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;devices&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DEVICES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;precision&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PRECISION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;strategy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;auto&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;max_epochs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;SAMPLE&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;max_steps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;SAMPLE&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;val_check_interval&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;SAMPLE&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;enable_progress_bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;exp_manager&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;exp_dir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;models&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;orthographic_benchmark_nemo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OmegaConf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="3.-Define-Trainer"&gt;3. Define Trainer&lt;a class="anchor-link" href="#3.-Define-Trainer"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Trainer orchestrates the training loop across devices, delegating tensor operations to PyTorch's backend. We initiate the trainer with the &lt;code&gt;OmegaConf&lt;/code&gt; config object we made above, and then set up an experiment manager to handle logging, checkpoint saving, and saving artifacts to disk.&lt;/p&gt;
&lt;p&gt;Note we use the cell magic &lt;a href="https://ipython.readthedocs.io/en/9.2.0/interactive/magics.html#cellmagic-capture"&gt;&lt;code&gt;%%capture&lt;/code&gt;&lt;/a&gt; below to hide long cell outputs for readability.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%capture&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Trainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;resolve_trainer_cfg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;exp_log_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exp_manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;exp_manager&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="4.-Data-and-Model-Setup"&gt;4. Data and Model Setup&lt;a class="anchor-link" href="#4.-Data-and-Model-Setup"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We load the pretrained model by fetching the model from our config first and then patching it for adapter support. Then, we load the model weights.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%capture&lt;/span&gt;
&lt;span class="n"&gt;model_cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ASRModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pretrained_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;update_model_config_to_support_adapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ASRModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pretrained_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;override_config_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We disable the CUDA graph decoder because it is incompatible with current PyTorch (2.10).&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%capture&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;open_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decoding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greedy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;use_cuda_graph_decoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_decoding_strategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decoding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Next, we prepare our data by merging our parameter overrides (batch size, num workers, etc.) into the model's built-in data config. Note that while keys not present in the original config are dropped, whitelisted keys are always injected.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[23]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train_ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update_model_cfg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train_ds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train_ds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup_training_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train_ds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validation_ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update_model_cfg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validation_ds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validation_ds&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup_multiple_validation_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validation_ds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Injecting white listed key `num_workers` into config
Injecting white listed key `pin_memory` into config
Injecting white listed key `batch_size` into config
Injecting white listed key `use_lhotse` into config
Injecting white listed key `channel_selector` into config
Removing unavailable key from config : is_tarred
Removing unavailable key from config : shuffle_n
Removing unavailable key from config : bucketing_strategy
Removing unavailable key from config : bucketing_batch_size
[NeMo I 2026-02-26 04:58:53 nemo_logging:393] Dataset loaded with 277410 files totalling 244.57 hours
[NeMo I 2026-02-26 04:58:53 nemo_logging:393] 5 files were filtered totalling 0.00 hours
Injecting white listed key `num_workers` into config
Injecting white listed key `pin_memory` into config
Injecting white listed key `batch_size` into config
Injecting white listed key `use_lhotse` into config
Injecting white listed key `channel_selector` into config
[NeMo I 2026-02-26 04:58:55 nemo_logging:393] Dataset loaded with 69352 files totalling 61.52 hours
[NeMo I 2026-02-26 04:58:55 nemo_logging:393] 2 files were filtered totalling 0.00 hours
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We also need to set the optimization function, which controls how the model’s weights are updated using gradients to minimize the loss and improve performance during training. We use AdamW with cosine annealing schedule and 10% warmup ratio as a starting point.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%capture&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup_optimization&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;optim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Configure spec augmentation from config if available, otherwise disable it.&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;spec_augment&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spec_augmentation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_config_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spec_augment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spec_augmentation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spec_augment&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="5.-Set-up-Adapter"&gt;5. Set up Adapter&lt;a class="anchor-link" href="#5.-Set-up-Adapter"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;An adapter is a small neural network module that learns to transform the pretrained model's internal representations specifically for child speech. Rather than retraining the entire model, we insert lightweight adapters into each layer of the encoder, the part of the model that processes audio features.&lt;/p&gt;
&lt;p&gt;We add a linear adapter to every encoder layer, then freeze the base model and unfreeze only the adapter weights. This keeps training efficient—only ~0.1% of parameters are trainable, while (hopefully) allowing the adapter to learn the acoustic and linguistic patterns unique to children's voices.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%capture&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;open_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;adapter_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;adapter_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;adapter_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;adapter_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;adapter_module_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;adapter_module_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;adapter_state_dict_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;adapter_state_dict_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;adapter_type_cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;adapter_type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;adapter_module_name&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;:&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;adapter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;adapter_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;adapter_module_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;adapter_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;adapter_global_cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter_global_cfg_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;adapter_global_cfg&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;add_global_adapter_cfg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;adapter_global_cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_adapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adapter_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;adapter_type_cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_adapter_available&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_enabled_adapters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_enabled_adapters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adapter_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;freeze&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unfreeze_enabled_adapters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;total_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;trainable_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requires_grad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Total parameters:     &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_params&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Trainable parameters: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;trainable_params&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;trainable_params&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;total_params&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%)&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Total parameters:     619,447,942
Trainable parameters: 1,622,016 (0.26%)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="6.-Train"&gt;6. Train&lt;a class="anchor-link" href="#6.-Train"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Let's adapt the pretrained model to children's voices!&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%capture&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We've hidden the training cell outputs to avoid printing many lines of logs. Below are a few key snippets of the log output that we saw when training:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Name&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Type&lt;span class="w"&gt;                              &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Params&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mode&lt;span class="w"&gt; &lt;/span&gt;
--------------------------------------------------------------------------------
&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;preprocessor&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AudioToMelSpectrogramPreprocessor&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;train
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;encoder&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ConformerEncoderAdapter&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;610&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;M&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;train
&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;decoder&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;RNNTDecoder&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;M&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;train
&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;joint&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;RNNTJoint&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.7&lt;span class="w"&gt; &lt;/span&gt;M&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;train
&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;loss&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;RNNTLoss&lt;span class="w"&gt;                          &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;train
&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;spec_augmentation&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SpectrogramAugmentation&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;train
&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;wer&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;WER&lt;span class="w"&gt;                               &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;train
--------------------------------------------------------------------------------
&lt;span class="m"&gt;1&lt;/span&gt;.6&lt;span class="w"&gt; &lt;/span&gt;M&lt;span class="w"&gt;     &lt;/span&gt;Trainable&lt;span class="w"&gt; &lt;/span&gt;params
&lt;span class="m"&gt;617&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;M&lt;span class="w"&gt;     &lt;/span&gt;Non-trainable&lt;span class="w"&gt; &lt;/span&gt;params
&lt;span class="m"&gt;619&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;M&lt;span class="w"&gt;     &lt;/span&gt;Total&lt;span class="w"&gt; &lt;/span&gt;params
&lt;span class="m"&gt;2&lt;/span&gt;,477.792&lt;span class="w"&gt; &lt;/span&gt;Total&lt;span class="w"&gt; &lt;/span&gt;estimated&lt;span class="w"&gt; &lt;/span&gt;model&lt;span class="w"&gt; &lt;/span&gt;params&lt;span class="w"&gt; &lt;/span&gt;size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;MB&lt;span class="o"&gt;)&lt;/span&gt;

Epoch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt; &lt;/span&gt;step&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;val_wer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;reached&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.20008&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;best&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.20008&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;saving&lt;span class="w"&gt; &lt;/span&gt;model&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/models/orthographic_benchmark_nemo/ASR-Adapter/2026-02-26_04-58-33/checkpoints/ASR-Adapter--val_wer=0.2001-epoch=0.ckpt&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;top&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
...
Epoch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt; &lt;/span&gt;step&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5000&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;val_wer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;reached&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.16359&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;best&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.16359&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;saving&lt;span class="w"&gt; &lt;/span&gt;model&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/models/orthographic_benchmark_nemo/ASR-Adapter/2026-02-26_04-58-33/checkpoints/ASR-Adapter--val_wer=0.1636-epoch=0.ckpt&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;top&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="sb"&gt;`&lt;/span&gt;Trainer.fit&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;stopped:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nv"&gt;max_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5000&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;reached.
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Because we configured &lt;code&gt;max_steps&lt;/code&gt; to be 5,000, we stopped training before we completed the first epoch.&lt;/p&gt;
&lt;p&gt;We need to save the final results. We save the adapter weights to a standalone file alongside the NeMo checkpoints.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[28]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;adapter_state_dict_name&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;state_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exp_log_dir&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;exp_log_dir&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getcwd&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ckpt_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;checkpoints&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ckpt_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;state_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ckpt_path&lt;/span&gt;
    &lt;span class="n"&gt;state_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;adapter_state_dict_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_adapters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state_path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="7.-Evaluation"&gt;7. Evaluation&lt;a class="anchor-link" href="#7.-Evaluation"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now it's time to assess how well our adapted model performs. We load the best trained checkpoint from disk and run inference across the entire validation set. The model transcribes each audio clip, and we compare these predictions against the reference transcriptions using Word Error Rate (WER). The WER calculation is copied exactly from the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/blob/main/metric/score.py"&gt;runtime repository&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%capture&lt;/span&gt;
&lt;span class="c1"&gt;# Load our model checkpoint&lt;/span&gt;
&lt;span class="n"&gt;nemo_ckpts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;exp_log_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;checkpoints&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.nemo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;nemo_ckpts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;No .nemo checkpoints found in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;exp_log_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/checkpoints/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;best_ckpt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nemo_ckpts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Loading checkpoint: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;best_ckpt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eval_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ASRModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;restore_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;best_ckpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;map_location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cuda&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;open_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;eval_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decoding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greedy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;use_cuda_graph_decoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;eval_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_decoding_strategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decoding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;patch_transcribe_lhotse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[&amp;nbsp;]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Run inference&lt;/span&gt;
&lt;span class="n"&gt;val_manifest_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validation_ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manifest_filepath&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val_manifest_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;val_entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;audio_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;audio_filepath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;val_entries&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;references&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;val_entries&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Running inference on &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; validation utterances...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eval_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;audio_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BATCH_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_selector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;average&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;predictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Running inference on 69354 validation utterances...
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Before scoring, let's remove any example where the normalized label is an empty string.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[31]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;normalizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EnglishTextNormalizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;english_spelling_normalizer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;filtered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;references&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;normalizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;references&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;wer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score_wer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;references&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Validation WER: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wer&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Sample predictions:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;references&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  REF:  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  PRED: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Validation WER: 0.1546

Sample predictions:
  REF:  ar
  PRED: ar

  REF:  they were going on a walk to a picnic
  PRED: they were going on a walk to a picnic

  REF:  a deer is little
  PRED: a gear and a skin

  REF:  what&amp;#39;s happening is when you when there&amp;#39;s an op when there&amp;#39;s a closed circuit the there is a the post but the wire&amp;#39;s wrapped around it is carrying some washers and when it
  PRED: what&amp;#39;s happening is when you when there&amp;#39;s an o when there&amp;#39;s a closed circuit the there is a the post with the wires wrapped around it is carrying some washers and when it

  REF:  blue
  PRED: blue

&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Our Validation WER after adapting the model is 0.15!&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;hr&gt;
&lt;h1 id="Step-3:-Make-your-submission"&gt;Step 3: Make your submission&lt;a class="anchor-link" href="#Step-3:-Make-your-submission"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Since this is a code execution competition, we will submit our model weights and code rather than predictions. See the &lt;a href="https://www.drivendata.org/competitions/308/childrens-word-asr/page/978/"&gt;code submission format&lt;/a&gt; webpage for more information.&lt;/p&gt;
&lt;p&gt;The general steps to follow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Develop inference code&lt;/li&gt;
&lt;li&gt;Test your submission locally&lt;/li&gt;
&lt;li&gt;Package submission&lt;/li&gt;
&lt;li&gt;Make a smoke test submission&lt;/li&gt;
&lt;li&gt;Once you have successfully debugged your submission, submit it for scoring on the full test set!&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Develop-Inference-Code"&gt;Develop Inference Code&lt;a class="anchor-link" href="#Develop-Inference-Code"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We need to set up a repository with a &lt;code&gt;main.py&lt;/code&gt; Python script which performs inference in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main"&gt;competition execution environment&lt;/a&gt; and writes our predictions to the required output file.  During code execution, our submission will be unzipped and run in the cloud compute cluster. The container will run your &lt;code&gt;main.py&lt;/code&gt; script.&lt;/p&gt;
&lt;p&gt;Our code must write a JSON Lines (JSONL) file containing one prediction per utterance.&lt;/p&gt;
&lt;p&gt;Each line must include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;utterance_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orthographic_text&lt;/code&gt;: UTF-8, standard English transcription of the utterance
The submission should be written to ./submission/submission.jsonl relative to the working directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See more details in the &lt;a href="https://www.drivendata.org/competitions/308/childrens-word-asr/page/978/"&gt;code submission format&lt;/a&gt; webpage and in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main/examples/word/parakeet"&gt;example submission&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In our &lt;code&gt;main.py&lt;/code&gt;, we load the trained adapter checkpoint from disk, restore the NeMo model, and run inference on all test utterances in batches. The script reads audio file paths from the test manifest, transcribes them using the adapted model, and writes the predicted transcriptions to the submission file in the required format. We sort utterances by duration before inference (longest first) to improve GPU memory efficiency during batching.&lt;/p&gt;
&lt;p&gt;See &lt;code&gt;orthographic_submission/main.py&lt;/code&gt; in the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub/blob/main/orthographic_submission/main.py"&gt;benchmark repository&lt;/a&gt; for the details.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Test-Submission-Locally"&gt;Test Submission Locally&lt;a class="anchor-link" href="#Test-Submission-Locally"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;You should first and foremost test your submission locally. This is a great way to work out any bugs and ensure that your model performs inference successfully. See the &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/tree/main?tab=readme-ov-file#testing-a-submission-locally"&gt;runtime repository's README&lt;/a&gt; for further instructions.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-benchmark-pub"&gt;benchmark repository&lt;/a&gt; provides a useful justfile command to run the trained model on a few sample files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Run inference using data-demo/word/ to test orthographic submission&lt;/span&gt;
test-orthographic:
&lt;span class="w"&gt;    &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;orthographic_submission/main.py&lt;span class="w"&gt; &lt;/span&gt;models/orthographic_benchmark_nemo/ASR-Adapter-best.nemo&lt;span class="w"&gt; &lt;/span&gt;data-demo/word/utterance_metadata.jsonl
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Package-Submission"&gt;Package Submission&lt;a class="anchor-link" href="#Package-Submission"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now we will package up our model and inference code into a zip file for predicting on the test set in the runtime container. The benchmark repository provides a justfile command to do this. The justfile finds the latest models weights, and then creates a zipfile combining those model weights with &lt;code&gt;/orthographic_submissions/main.py&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pack-orthographic:
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-euo&lt;span class="w"&gt; &lt;/span&gt;pipefail
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;latest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-td&lt;span class="w"&gt; &lt;/span&gt;models/orthographic_benchmark_nemo/ASR-Adapter/*/checkpoints/ASR-Adapter.nemo&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;head&lt;span class="w"&gt; &lt;/span&gt;-1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ln&lt;span class="w"&gt; &lt;/span&gt;-sf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;#models/orthographic_benchmark_nemo/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;models/orthographic_benchmark_nemo/ASR-Adapter-best.nemo
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Updated ASR-Adapter-best.nemo -&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$latest&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;orthographic_submission.zip
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;orthographic_submission&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zip&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;../orthographic_submission.zip&lt;span class="w"&gt; &lt;/span&gt;main.py&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;models/orthographic_benchmark_nemo&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zip&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;../../orthographic_submission.zip&lt;span class="w"&gt; &lt;/span&gt;ASR-Adapter-best.nemo&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Another packing command is available on the runtime repo's orthographic &lt;a href="https://github.com/drivendataorg/childrens-speech-recognition-runtime/blob/main/examples/word/parakeet/pack_submission.sh"&gt;example&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Make-a-Smoke-Test-Submission"&gt;Make a Smoke Test Submission&lt;a class="anchor-link" href="#Make-a-Smoke-Test-Submission"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We provide a "smoke test" environment that replicates the test inference runtime but runs only on a small set of audio files. In the smoke test runtime, data/ contains 9,000 audio files from the training set.&lt;/p&gt;
&lt;p&gt;Let's submit our submission.zip to a smoke test on the platform.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;div align="center"&gt;
&lt;img src="https://www.drivendata.co/images/gates_asr_smoke_test_ortho.png" alt="Screenshot of the competition submission page showing the options of a normal submission or a smoke test submission." width="70%"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;After hitting "Submit" you can see the job in the queue—it will progress from "Uploading" to "Pending" to "Starting" to "Running":&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;div align="center"&gt;
&lt;img src="https://www.drivendata.co/images/gates_asr_smoke_test_jobs_ortho.png" alt="Screenshot of the competition submission page showing a smoke test submission that is in progress." width="75%"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Once your submission reaches "Completed", head on over to the "Submissions" tab to see your smoke test score.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Submit!"&gt;Submit!&lt;a class="anchor-link" href="#Submit!"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;After you've made sure a smoke test submission runs without error, you're ready to submit the real deal! This adaptation of &lt;code&gt;parakeet-tdt-0.6b-v2&lt;/code&gt; results in a .2370 WER on the full test set.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;div align="center"&gt;
&lt;img src="https://www.drivendata.co/images/gates_asr_submission_ortho.png" alt="Screenshot of the competition submission page showing a successfully completed and scored full submission." width="75%"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We encourage you to also be mindful of the submission limit (3 per 7 days at most) and others' code jobs. Canceled jobs do not count against the submission limit.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;This is of course just one of the approaches you could take for this challenge. Some resources that may be helpful in getting started are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Hugging Face &lt;a href="https://huggingface.co/learn/audio-course/en/chapter5/introduction"&gt;Automatic Speech Recognition&lt;/a&gt; unit of their Audio Course.&lt;/li&gt;
&lt;li&gt;The Hugging Face &lt;a href="https://huggingface.co/spaces/hf-audio/open_asr_leaderboard"&gt;Open ASR Leaderboard&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;A &lt;a href="https://github.com/Deep-unlearning/Finetune-Parakeet"&gt;Parakeet fine-tuning implementation&lt;/a&gt; from Deep-unlearning.&lt;/li&gt;
&lt;li&gt;NeMo example &lt;a href="https://github.com/NVIDIA-NeMo/NeMo/tree/main/examples/asr/asr_adapters"&gt;ASR adaptation&lt;/a&gt; (which has a similar implementation as this blog post).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to share any of your findings or have questions, feel free to post on the &lt;a href="https://community.drivendata.org/c/childrens-asr/109"&gt;community forum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 


&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: 'center'," +
        "    displayIndent: '0em'," +
        "    showMathMenu: true," +
        "    tex2jax: { " +
        "        inlineMath: [ ['$','$'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        " linebreaks: { automatic: true, width: '95% container' }, " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
        "    } " +
        "}); ";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;
</content><category term="blog"></category><category term="tutorial"></category><category term="competition"></category><category term="audio data"></category><category term="education"></category></entry><entry><title>5 Challenges of Creating Beautiful Data Pipelines</title><link href="https://www.drivendata.co/blog/pipeline-challenges" rel="alternate"></link><published>2026-02-18T00:00:00-05:00</published><updated>2026-02-18T00:00:00-05:00</updated><author><name>Jackie Glasheen</name></author><id>tag:www.drivendata.co,2026-02-18:/blog/pipeline-challenges</id><summary type="html">&lt;p&gt;A look into the hidden complexity of data pipelines, and some suggestions to improve the process.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Almost all projects we work on at DrivenData share a fundamental need: getting data from a raw form into a final, processed form. Sometimes, a project's core goal is to create a data pipeline that will run in perpetuity and continuously process live feeds of data. More often, our data pipelines are enabling processes that serve a larger purpose, such as preparing data for use in training a machine learning model.&lt;/p&gt;
&lt;p&gt;While most pipelines start out seeming like a simple set of sequential steps, the reality is that pipeline code often becomes a deep source of technical debt. Over time, complexity accumulates as capabilities are added. For example, we may need a development version that runs on less data. We may need separate production and dev environments. We need audit trails and observability to make sure everything processed correctly. We need error capturing and recovery, and we need the right decisions about when to stop and when to keep processing. We need the code to use resources efficiently through mechanisms like parallelization and caching. We need to be smart about incrementally updating versus re-doing every task from scratch. We need to augment a pipeline step with a different dataset that has separate re-process conditions. Soon, the code is a complex tangle that is hard to reason about and maintain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this blog post, I’ll discuss some of the challenges of creating data pipelines for data science projects.&lt;/strong&gt; We hope to bring clarity to what makes pipelining complex, simplify implementation decisions, and help data science teams make &lt;em&gt;beautiful&lt;/em&gt; data pipelines from the start.&lt;/p&gt;
&lt;h2 id="why-is-something-seemingly-simple-so-hard"&gt;Why is something seemingly simple so hard?&lt;a class="headerlink" href="#why-is-something-seemingly-simple-so-hard" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Imagine you need to prepare news article data to train a machine learning model to classify whether an article discusses data, AI, or machine learning. That doesn’t sound too hard! A simple Python implementation could look like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.model_selection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.pipeline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Pipeline&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.feature_extraction.text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TfidfVectorizer&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.linear_model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LogisticRegression&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_data_directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;path/to/raw_data&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Step 1: Load Data From a Folder&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_data_directory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 2: Preprocess Data&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;preprocess_dataframe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 3: Train/Test Split&lt;/span&gt;
    &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;article_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;label&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 4: Define Vectorizer and Classifier&lt;/span&gt;
    &lt;span class="n"&gt;text_clf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Pipeline&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vectorizer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TfidfVectorizer&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;classifier&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LogisticRegression&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 5: Train Model&lt;/span&gt;
    &lt;span class="n"&gt;text_clf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 6: Evaluate Model&lt;/span&gt;
    &lt;span class="n"&gt;evaluate_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text_clf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, the &lt;code&gt;load_data&lt;/code&gt; and &lt;code&gt;preprocess_dataframe&lt;/code&gt; functions turn out to never be quite as simple as they seem. In the next sections, we will walk through a few common pain points that show up as you move from the drawing board to a fleshed-out pipeline.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="1-the-cold-start-problem"&gt;1. The cold start problem&lt;a class="headerlink" href="#1-the-cold-start-problem" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A new pipeline starts as a blank slate, and figuring out where to begin isn’t always obvious. There are countless ways to organize files and structure steps. Figuring out the right order of operations can take some work.&lt;/p&gt;
&lt;p&gt;In our data-topic detection example, you might wonder: Should we store an intermediary data file with article text and metadata when we preprocess it? What metadata should we even track? When should we deduplicate the article data? What are the upstream dependencies of our processing steps?&lt;/p&gt;
&lt;p&gt;Each of these decisions starts to introduce complexity into what was a simple pipeline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To start, sketch out the pipeline process visually to clarify dependencies and to ground alignment conversations about the pipeline in something concrete.&lt;/li&gt;
&lt;li&gt;As you structure the pipeline, separate transformation logic from pipeline orchestration (the code that runs each step). In our data-topic detection model starter code, we were on the right track with a &lt;code&gt;main&lt;/code&gt; function as the entry point to the pipeline that calls external helper functions (&lt;code&gt;load_data()&lt;/code&gt;, &lt;code&gt;preprocess_dataframe()&lt;/code&gt;, and &lt;code&gt;evaluate_model()&lt;/code&gt;) in sequential steps.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cookiecutter-data-science.drivendata.org/opinions/#:~:text=Data%20analysis%20is%20a%20directed%20acyclic%20graph"&gt;Structure pipeline steps as a directed acyclic graph&lt;/a&gt; ("DAG") so that each step depends only on its inputs and produces outputs for downstream steps, and each step flows forward to the next without ever looping back on itself. Relatedly, &lt;a href="https://cookiecutter-data-science.drivendata.org/opinions/#:~:text=Raw%20data%20is%20immutable"&gt;raw data must be treated as immutable&lt;/a&gt; (that is, don't overwrite the original data files; instead, save the results of the pipeline as new output files).&lt;/li&gt;
&lt;li&gt;Follow the software engineering principle of separation of concerns by breaking down complex logic and processing into modular functions that complete distinct objectives. Separation of concerns is a fundamental part of developing organized and clear pipelines. Modularity also makes each of the processing steps independently testable so you can have a test suite that ensures each granular step is doing what you expect. In our data-topic detection pipeline, we should isolate each task in our data preprocessing step and make separate functions that complete single objectives or operations:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;remove_duplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO: implement deduplication&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;drop_missing_labels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label_col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;label&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO: drop rows where label_col is null&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;normalize_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text_col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;article_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO: normalization steps&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;encode_labels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label_col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;label&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO: map label values to numeric codes&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Design the pipeline to be fully re-runnable end-to-end with minimal involvement. For example, make &lt;code&gt;main()&lt;/code&gt; runnable from the command line by adding an entry point so that the pipeline runs when you execute &lt;code&gt;python identify_data_topics.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When we start to need more options and arguments at the command line, we like &lt;a href="https://cyclopts.readthedocs.io/en/latest/index.html"&gt;&lt;code&gt;Cyclopts&lt;/code&gt;&lt;/a&gt; for building command-line interfaces.&lt;/li&gt;
&lt;li&gt;It may be helpful to use DrivenData's &lt;a href="https://cookiecutter-data-science.drivendata.org/"&gt;Cookiecutter Data Science package&lt;/a&gt; when creating a new repository to house your pipeline. Using a well-defined, standard project structure will &lt;a href="https://cookiecutter-data-science.drivendata.org/why/"&gt;benefit you and your team in the long run&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="2-adding-basic-pipeline-features-is-a-worthwhile-investment"&gt;2. Adding basic pipeline features is a worthwhile investment&lt;a class="headerlink" href="#2-adding-basic-pipeline-features-is-a-worthwhile-investment" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Stringing the steps together isn’t enough. As soon as you start running the pipeline, you'll realize you have no idea what is happening while you are running it. Add-ons such as logging, metadata tracking, and error handling will reduce debugging time, yield results you can be more confident in, and help identify bottlenecks in the process. These add-ons are generally worth it and justify budgeting the up-front implementation time.&lt;/p&gt;
&lt;p&gt;In the data-topic detection pipeline, logs could show exactly where a run failed and how long each step took. Adding tools to preprocess news articles in parallel can substantially reduce processing time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add lightweight logging to capture per-task progress and errors, making debugging easier. We like &lt;a href="https://loguru.readthedocs.io/en/stable/"&gt;&lt;code&gt;Loguru&lt;/code&gt;&lt;/a&gt;, an intuitive Python logging library.&lt;/li&gt;
&lt;li&gt;Speed up long processes by parallelizing tasks (running independent work concurrently) where possible. We often use &lt;a href="https://tqdm.github.io/docs/contrib.concurrent/"&gt;&lt;code&gt;tqdm&lt;/code&gt;&lt;/a&gt;, specifically the &lt;code&gt;process_map&lt;/code&gt; and &lt;code&gt;thread_map&lt;/code&gt; concurrent versions.&lt;/li&gt;
&lt;li&gt;Despite best efforts, pipeline runs often unexpectedly fail because of data errors or edge cases. Disk &lt;a href="https://en.wikipedia.org/wiki/Cache_(computing)"&gt;caching&lt;/a&gt; computationally expensive steps can be a huge time saver in these cases because it enables you to resume progress where you left off just before the error arose in a task rather than restarting all computations. The &lt;a href="https://grantjenks.com/docs/diskcache/api.html#diskcache.Cache.memoize"&gt;&lt;code&gt;@memoize&lt;/code&gt; decorator&lt;/a&gt; works well for caching the results of functions.&lt;/li&gt;
&lt;li&gt;Track and maintain metadata such as file hashes (which are fixed-length identifiers generated from a file's content using &lt;a href="https://en.wikipedia.org/wiki/Hash_function"&gt;hash functions&lt;/a&gt;), unique IDs, and pipeline version for reproducibility. In our data-topic detection example, you could generate and track hashes of the article text with a function to confirm data isn’t being corrupted run-to-run. (Notice we also have logging and parallelization at the task level in this example!):&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;loguru&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tqdm.contrib.concurrent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;process_map&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;hash_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;hash_article_texts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Add a &amp;#39;text_hash&amp;#39; column to the DataFrame containing MD5 hashes of the &amp;#39;article_text&amp;#39; column.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hashing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; articles&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text_hash&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hash_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;article_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Finished generating text hashes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;If the pipeline writes files, add an &lt;code&gt;overwrite&lt;/code&gt; parameter that raises an error (or skips writing the file) if a file already exists and &lt;code&gt;overwrite&lt;/code&gt; is set to &lt;code&gt;False&lt;/code&gt;. This prevents accidentally overwriting existing files on subsequent pipeline runs.&lt;/li&gt;
&lt;li&gt;Consider adding a &lt;code&gt;debug&lt;/code&gt; mode parameter to your pipeline that, when activated, runs the pipeline on a small sample of data so you can test changes quickly and make sure the whole pipeline runs as expected.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="3-varied-inputs-lead-to-complicated-code"&gt;3. Varied inputs lead to complicated code&lt;a class="headerlink" href="#3-varied-inputs-lead-to-complicated-code" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Inevitably, project inputs expand beyond a single clean data source. Each CSV file, scraped HTML document, JSON object, and API call comes with its own quirks and processing needs. Real-world data is messy: missing labels, odd encodings, and inconsistent formats often only reveal themselves once the pipeline runs at scale. And it’s not just data; every parameter or configuration you add can shift assumptions and introduce new branches in the logic.&lt;/p&gt;
&lt;p&gt;In our data-topic detection pipeline, expanding beyond a single CSV with news articles could mean that you need to add separate cleaning steps for other formats. You might also discover that some articles in the training data are missing a label indicating whether the article discusses data, AI, or machine learning, or are in another language, or have source text from multiple articles stuck together. You have to account for these edge cases in the pipeline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Standardize and clean data early so later steps can assume consistent input. Preferably with a consistent, validated schema so malformed data fails early.&lt;/li&gt;
&lt;li&gt;Factor out shared utility functions instead of duplicating code for each source.&lt;/li&gt;
&lt;li&gt;Validate key assumptions early in the pipeline to catch anomalies, and fail loudly (e.g., raise errors) when those assumptions are not met. Raising errors early in the pipeline prevents wasted processing time for runs that fail. In our data-topic detection pipeline, if we need to ingest news articles from a website, our first step might be checking if the base URL for the website returns a "200" status code, indicating the website is active. If it doesn't return "200", we should skip processing because the site is down rather than issuing thousands of requests for articles that don't exist:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ingest_articles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Ingest news articles from a website&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Base URL &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; returned status code &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# TODO: implement article ingestion&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;articles&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;h2 id="4-tech-debt-in-a-world-of-changing-requirements"&gt;4. Tech debt in a world of changing requirements&lt;a class="headerlink" href="#4-tech-debt-in-a-world-of-changing-requirements" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Project goals, requirements, and data formats change over time. This can create headaches when the existing pipeline needs to be refactored to account for processing conditions that didn’t initially exist. How will you handle backwards compatibility? Do you deprecate the "old way" of doing things entirely, or make the "old way" one of many processing options that can be triggered by calling certain parameters?&lt;/p&gt;
&lt;p&gt;To avoid tech debt, it’s tempting to design a pipeline that is scoped out to be compatible with many processing scenarios from the start. But this, too, comes with downsides, as code will often be unnecessarily complex to preserve flexibility that you might not actually need.&lt;/p&gt;
&lt;p&gt;In our example, maybe you first designed the pipeline to process a single labeled dataset. Later, you get access to additional datasets and decide you need to track metadata fields such as article author and publication date by source. Meeting these new needs means adjusting the data organization, adding new processing steps, and sometimes rethinking the overall pipeline structure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changing goals, requirements, and data sources is sometimes unavoidable. Before diving into the refactor, visually map out options for updated pipelines, consider the level of effort and tradeoffs required for each option, and align with teammates on a course of action. We often make pipeline visualizations on simple annotated slides:
&lt;img alt="Data Pipeline Example" src="/images/data-pipeline-example.png" /&gt;&lt;/li&gt;
&lt;li&gt;Sprawling if/else logic across the pipelines for different data sources is a code smell. Your goal should be to standardize what you need to at the moment the data source is first initialized and then share as much unchanged pipeline code as possible.&lt;/li&gt;
&lt;li&gt;Tech debt comes into play for what packages and libraries you choose as well. When multiple library options are available, try to pick the most well-maintained and widely used libraries up front. Look at how long it's been since the most recent commit to the package's source code repository, and how many stars the repository has on GitHub. Well-maintained and widely used packages are less likely to introduce new bugs down the line as new versions of other dependencies are released.&lt;/li&gt;
&lt;li&gt;Be deliberate about where flexibility is truly valuable. Communicate with your team about the tradeoffs, and make simplifying assumptions where you can.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="5-beauty-takes-time"&gt;5. Beauty takes time&lt;a class="headerlink" href="#5-beauty-takes-time" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There’s always a balance to strike between getting something working quickly and building something clean and easily maintainable. Extra beautification efforts, such as clear file names, informative comments, and tidy dataset creation, pay off in the long run. You or a teammate will inevitably return to make modifications to the pipeline, and clear, well-documented code will make it easier to understand and less prone to having bugs accidentally introduced when updating it. But, if there is a quick deadline, it may be reasonable to take some shortcuts.&lt;/p&gt;
&lt;p&gt;In our data-topic detection example, naming an intermediate dataset &lt;code&gt;processed_labeled_articles&lt;/code&gt; instead of &lt;code&gt;test_dataset_3&lt;/code&gt; makes the pipeline clearer without slowing you down. Refactoring article processing code that works, but is duplicative or inefficient, requires more effort; whether the refactor is worth it is a judgment call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suggestions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The level of investment in the pipeline development should be proportional to how long one run takes and how often it will be run end-to-end. If the completed pipeline will be run just once, it may be enough to make a pipeline that produces accurate results relatively fast. In cases where the pipeline will be run often, it is usually worth it to make the pipeline accurate, efficient, and refactored for clarity and maintainability. It is a good idea to align with your team on how much polish is needed before diving into any big code refactors.&lt;/li&gt;
&lt;li&gt;Pick descriptive names for files, functions, and outputs from the start.&lt;/li&gt;
&lt;li&gt;Include descriptive docstrings in functions. We've found that LLM coding assistants (e.g., Copilot) or tools that set up docstring structures (e.g., &lt;a href="https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring"&gt;&lt;code&gt;autoDocstring&lt;/code&gt;&lt;/a&gt; extension for VS Code) make properly documenting functions quick and easy.&lt;/li&gt;
&lt;li&gt;Adding type hints (explicit input/output types in function signatures) is helpful for clarity and aids in error detection, especially when used alongside type-checking tools like &lt;a href="https://mypy-lang.org/"&gt;&lt;code&gt;MyPy&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://docs.astral.sh/ty/"&gt;&lt;code&gt;ty&lt;/code&gt;&lt;/a&gt;, and &lt;a href="https://microsoft.github.io/pyright/#/"&gt;&lt;code&gt;Pyright&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Refactor small inconsistencies as you go instead of letting them pile up. Likewise, format code as you go using automatic formatting tools, like &lt;a href="https://black.readthedocs.io/en/stable/"&gt;&lt;code&gt;Black&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://docs.astral.sh/ruff/formatter/"&gt;&lt;code&gt;Ruff&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pipelines are often parameterized: the code can be configured to run in different ways by changing inputs (parameters) rather than modifying the code itself. For each run of your pipeline, you should record the configuration used, environment variables, timestamps, and pointers to log files or outputs for future reference. You can, of course, do this recording manually (e.g., copying the exact command you ran, including parameters, and other pertinent information into a tracking file or notebook). But we recommend capturing and persisting this information automatically using config files/ environment variables for setting pipeline parameters and automated run tracking systems for recording run metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="embracing-challenging-pipelines-with-intentional-effort"&gt;Embracing challenging pipelines with intentional effort&lt;a class="headerlink" href="#embracing-challenging-pipelines-with-intentional-effort" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Making data pipelines is an aspect of most data science projects. And it often seems so simple from the outside: just move data from A to B. As soon as you start building, though, the hidden complexity emerges.&lt;/p&gt;
&lt;p&gt;There are many tools you can use to facilitate pipelines rather than creating Python pipelines from scratch (e.g., &lt;a href="https://dagster.io/"&gt;Dagster&lt;/a&gt;). But these tools add learning curves and complexity. It often makes sense to start an implementation from a Python script and then invest in more tooling later if needed. &lt;/p&gt;
&lt;p&gt;With some of the best practices we discuss, we can prevent some of the pain points and common pitfalls that domain-specific tools try to solve for and make it easy to have reliable, trustworthy pipelines with minimal dependencies and the right level of investment. &lt;/p&gt;
&lt;p&gt;For further reading about general data science best practices, DrivenData's ebook &lt;a href="https://drivendata.co/insights/"&gt;The 10 Rules of Reliable Data Science&lt;/a&gt; is publicly available for download.&lt;/p&gt;</content><category term="blog"></category><category term="insights"></category><category term="resources"></category></entry></feed>