vue3+vosk-browser离线语音识别功能

简介:

Vosk-Browser 是指将 Vosk 语音识别工具 应用于浏览器环境中。Vosk 是一个离线开源的语音识别库,支持多种语言和平台,包括通过 WebAssembly (Wasm) 在浏览器中运行。

如何在浏览器中使用 Vosk?

Vosk 提供了 JavaScript/WebAssembly 版本,可以直接在网页中实现离线语音识别,无需依赖云端服务。
1,安装vosk-browser

npm i vosk-browser

2,在官网下载一个模型 https://alphacephei.com/vosk/models 本地用small,准确率不是100%
在这里插入图片描述
放在public下
在这里插入图片描述
3,在页面使用

<template>
  <div class="bg">
    <button @click="startRecording">开始录音</button>
    <button @click="stopRecording">停止录音</button>
  </div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import { createModel } from 'vosk-browser';
const isListening = ref(false);
const error = ref(null);
let recognition = null;
let model = null;
// 采样率
let mySampleRate = 16000
// 初始化模型
const initModel = async () => {
  try {
    model = await createModel("/vosk-model-small-cn-0.22.zip");
    console.log("模型加载成功!");
    // startRecording()
  } catch (error) {
    error.value = `模型加载失败: ${err.message}`;
    console.error("模型加载错误:", err);
  }
};

// 开始录音
const startRecording = async () => {
  try {
    // 1. 获取音频流(确保采样率匹配)
    const mediaStream = await navigator.mediaDevices.getUserMedia({
      video: false,
      audio: {
        echoCancellation: true,
        noiseSuppression: true,
        channelCount: 1,
        sampleRate: mySampleRate
      },
    });
    console.log('音频流获取成功', mediaStream.getAudioTracks()[0].label);

    // 2. 创建识别器(
    const recognizer = new model.KaldiRecognizer(mySampleRate);
    console.log('识别器创建成功', recognizer);

    // 3. 设置事件监听
    recognizer.on("result", (message) => {
      console.log('识别结果:', message.result?.text || '无文本');
    });
    recognizer.on("partialresult", (message) => {
      // if (message.result?.partial) {
      //   console.log('临时结果:', message.result?.partial || '无文本');
      // }

    });
    recognizer.on("error", (err) => {
      console.error('识别器错误:', err);
    });


    // 4. 创建音频上下文(确保采样率匹配)
    const audioContext = new AudioContext({ sampleRate: mySampleRate });
    console.log('创建音频上下文(确保采样率匹配)', audioContext)

    // 5. 设置音频处理节点
    const recognizerNode = audioContext.createScriptProcessor(4096, 1, 1)
    console.log('设置音频处理节点', recognizerNode)


    recognizerNode.onaudioprocess = (event) => {
      try {
        // 1. 增强音频信号(应用增益)
        const channelData = event.inputBuffer.getChannelData(0);
        const boostedData = new Float32Array(channelData.length);

        // 应用5倍增益(根据实际情况调整)
        const gainMultiplier = 5.0;
        for (let i = 0; i < channelData.length; i++) {
          boostedData[i] = Math.min(1.0, Math.max(-1.0, channelData[i] * gainMultiplier));
        }

        // 2. 调试输出
        const maxVolume = Math.max(...Array.from(boostedData).map(Math.abs));
        // console.log('增强后音频峰值:', maxVolume.toFixed(4));

        // 3. 提交处理
        if (maxVolume > 0.01) { // 有效音量阈值
          if (recognizer.acceptWaveformFloat) {
            // 使用底层API确保兼容性
            recognizer.acceptWaveformFloat(boostedData, mySampleRate);
          } else {
            // 标准处理方式
            recognizer.acceptWaveform(event.inputBuffer);
          }
        }

      } catch (error) {
        console.error('音频处理错误:', error);
      }
    }
    const source = audioContext.createMediaStreamSource(mediaStream);
    source.connect(recognizerNode);
    recognizerNode.connect(audioContext.destination);
    console.log("语音识别已启动");
    // 返回停止方法
    return () => {
      mediaStream.getTracks().forEach(track => track.stop());
      recognizerNode.disconnect();
      audioContext.close();
    };

  } catch (err) {
    console.error('初始化失败:', {
      error: err.message,
      stack: err.stack
    });
    error.value = `麦克风访问失败: ${err.message}`;
  }
};

// 停止录音
const stopRecording = () => {
  if (recognition) {
    recognition.stop();
    isListening.value = false;
  }
};


onMounted(() => {
  initModel();

})
onUnmounted(() => {
  if (recognition) recognition.stop();
  console.log('卸载')
});
</script>

在这里插入图片描述

备注:

1,目前只用星愿浏览器测试过,火狐提示不能固定采样率,目前设置的采样率是16000,不是很理解这个值
在这里插入图片描述
查了一下是这个原因,也尝试按搜的方法获取采样率,获取的值是48000,识别结果无法使用
在这里插入图片描述
2,收不到声音测试一下电脑音频输入是否好使

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值