# 语音识别(自定义识别内容)

# 代码展示

import * as speechCommands from '@tensorflow-models/speech-commands';
import * as tfvis from '@tensorflow/tfjs-vis';

const MODEL_PATH = 'http://127.0.0.1:8080';
let transferRecognizer; // 迁移学习器

window.onload = async () => {
  const recognizer = speechCommands.create(
    // 创建语音识别器
    'BROWSER_FFT',
    null,
    MODEL_PATH + '/speech/model.json',
    MODEL_PATH + '/speech/metadata.json'
  );
  await recognizer.ensureModelLoaded(); // 确保加载完成

  transferRecognizer = recognizer.createTransfer('轮播图'); // 创建迁移学习器(迁移学习器可以学习自定义内容)
};

window.collect = async (btn) => {
  btn.disabled = true;
  const label = btn.innerText;
  await transferRecognizer.collectExample(
    // 收集训练数据
    // 收集语音训练素材(异步)
    label === '背景噪音' ? '_background_noise_' : label // speech-commands包保留的字段‘_background_noise_’,设置成这个就表示背景噪音
  );
  btn.disabled = false;
  document.querySelector('#count').innerHTML = JSON.stringify(
    transferRecognizer.countExamples(), // 统计训练样本数量
    null,
    2 // 空格
  );
};

window.train = async () => {
  await transferRecognizer.train({
    // 迁移学习期的train方法
    epochs: 30,
    callback: tfvis.show.fitCallbacks({ name: '训练效果' }, ['loss', 'acc'], {
      callbacks: ['onEpochEnd'],
    }),
  });
};

window.toggle = async (checked) => {
  if (checked) {
    await transferRecognizer.listen(
      // 监听
      (result) => {
        const { scores } = result; // 是一个所有单词数组的得分情况
        const labels = transferRecognizer.wordLabels(); // 获取所有label
        const index = scores.indexOf(Math.max(...scores)); // 获取最高得分的index
        console.log(labels[index]);
      },
      {
        overlapFactor: 0, // 大于等于0小于1
        probabilityThreshold: 0.75, // 可能性的预值(高于这个预值listen的回调才会执行)
      }
    );
  } else {
    transferRecognizer.stopListening(); // 停止监听训练
  }
};

window.save = () => {
  const arrayBuffer = transferRecognizer.serializeExamples(); // 把采集好的数据序列化为arrayBuffer
  const blob = new Blob([arrayBuffer]); // 转化为blob
  const link = document.createElement('a'); //  创建a标签模拟点击下载
  link.href = window.URL.createObjectURL(blob); // 获取下载链接
  link.download = 'data.bin'; // 下载名称(二进制文件)
  link.click();
};
<script src="index.js"></script>
<button onclick="collect(this)">上一张</button>
<button onclick="collect(this)">下一张</button>
<button onclick="collect(this)">背景噪音</button>
<button onclick="save()">保存</button>
<pre id="count"></pre>
<button onclick="train()">训练</button>
<br /><br />
监听开关:<input type="checkbox" onchange="toggle(this.checked)" />

# 重点笔记

  • 语音识别器的创建与使用
const recognizer = speechCommands.create(
  // 创建语音识别器
  'BROWSER_FFT',
  null,
  MODEL_PATH + '/speech/model.json',
  MODEL_PATH + '/speech/metadata.json'
);
await recognizer.ensureModelLoaded(); // 确保加载完成

transferRecognizer = recognizer.createTransfer('轮播图'); // 创建迁移学习器(迁移学习器可以学习自定义内容)

transferRecognizer 的方法

transferRecognizer.collectExample() 收集训练数据

transferRecognizer.countExamples() 统计训练样本数量

transferRecognizer.train() 训练

transferRecognizer.listen() 监听

transferRecognizer.stopListening() 停止监听

transferRecognizer.wordLabels() 看一下模型能识别哪些内容

transferRecognizer.serializeExamples() 把采集好的数据序列化为 arrayBuffer

transferRecognizer.loadExamples() 加载外部数据

  • JSON.stringfy()有三个参数 JSON.stringfy

  • 掌握保存音频训练数据的方法

先把采集好的数据序列化为 arrayBuffer,然后将 arrayBuffer 转为 blob,最后通过模拟点击 a 标签下载保存为二进制文件

window.save = () => {
  const arrayBuffer = transferRecognizer.serializeExamples(); // 把采集好的数据序列化为arrayBuffer
  const blob = new Blob([arrayBuffer]); // 转化为blob
  const link = document.createElement('a'); //  创建a标签模拟点击下载
  link.href = window.URL.createObjectURL(blob); // 获取下载链接
  link.download = 'data.bin'; // 下载名称(二进制文件)
  link.click();
};