# 语音识别(自定义识别内容)
# 代码展示
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();
};
← 语音识别(预训练模型) 语音轮播图 →