Vosk-api Web界面开发:构建语音识别Web应用

【免费下载链接】vosk-api vosk-api: Vosk是一个开源的离线语音识别工具包,支持20多种语言和方言的语音识别,适用于各种编程语言,可以用于创建字幕、转录讲座和访谈等。 【免费下载链接】vosk-api 项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api

1. 项目概述与环境准备

Vosk-api是一个开源离线语音识别工具包,支持20多种语言的实时语音识别。本文将指导你构建基于Web技术栈的语音识别应用,实现浏览器端语音采集与后端识别处理的完整流程。

1.1 核心优势与应用场景

特性 描述 应用场景
离线运行 无需网络连接,保护数据隐私 本地办公、医疗记录
低资源占用 模型体积50MB左右,CPU即可运行 嵌入式设备、移动端WebView
多语言支持 覆盖中英日韩等20+语言 国际会议字幕、多语言客服
实时响应 流式API设计,延迟<100ms 语音助手、实时字幕

1.2 开发环境配置

# 克隆项目仓库
git clone https://gitcode.com/GitHub_Trending/vo/vosk-api
cd vosk-api

# 安装Node.js依赖
cd nodejs
npm install

2. 技术架构设计

2.1 系统架构图

mermaid

2.2 技术栈选择

  • 前端:HTML5、Vanilla JS、Web Audio API
  • 后端:Node.js、Express、WebSocket
  • 语音处理:Vosk-api、WAV格式处理
  • 部署:Node.js内置HTTP服务器

3. 后端服务实现

3.1 创建Express服务器

// server.js
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const vosk = require('./index');
const fs = require('fs');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// 配置Vosk模型
const MODEL_PATH = 'model';
if (!fs.existsSync(MODEL_PATH)) {
    console.error("请下载模型并解压到model目录");
    process.exit(1);
}

vosk.setLogLevel(0);
const model = new vosk.Model(MODEL_PATH);

// 提供静态网页
app.use(express.static('public'));

// WebSocket连接处理
wss.on('connection', (ws) => {
    const rec = new vosk.Recognizer({ model: model, sampleRate: 16000 });
    
    ws.on('message', (data) => {
        if (rec.acceptWaveform(data)) {
            const result = rec.result();
            ws.send(JSON.stringify(result));
        }
    });

    ws.on('close', () => {
        rec.free();
    });
});

const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`服务器运行在 http://localhost:${PORT}`);
});

3.2 音频流处理模块

基于nodejs/demo/test_microphone.js改造的音频处理逻辑:

// audio-processor.js
const { Readable } = require('stream');

class AudioProcessor {
    constructor(recognizer) {
        this.recognizer = recognizer;
        this.buffer = [];
    }

    processChunk(chunk) {
        // 转换音频格式为16kHz单声道PCM
        const pcmData = this.convertToPCM(chunk);
        
        if (this.recognizer.acceptWaveform(pcmData)) {
            return this.recognizer.result();
        } else {
            return this.recognizer.partialResult();
        }
    }

    convertToPCM(chunk) {
        // 实现音频格式转换逻辑
        // 实际项目中建议使用ffmpeg或audiojs库处理
        return chunk;
    }

    finalize() {
        return this.recognizer.finalResult();
    }
}

module.exports = AudioProcessor;

4. 前端界面开发

4.1 页面结构设计

创建public/index.html文件:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vosk语音识别Web应用</title>
    <style>
        .container { max-width: 800px; margin: 0 auto; padding: 20px; }
        #status { color: #666; height: 24px; }
        #transcriptBox { 
            border: 1px solid #ccc; 
            min-height: 200px; 
            margin: 20px 0; 
            padding: 10px; 
            white-space: pre-wrap;
        }
        .controls { display: flex; gap: 10px; margin-bottom: 20px; }
        button { 
            padding: 10px 20px; 
            border: none; 
            border-radius: 4px; 
            cursor: pointer;
        }
        #startBtn { background-color: #4CAF50; color: white; }
        #stopBtn { background-color: #f44336; color: white; }
    </style>
</head>
<body>
    <div class="container">
        <h1>Vosk离线语音识别</h1>
        <div class="controls">
            <button id="startBtn">开始识别</button>
            <button id="stopBtn" disabled>停止识别</button>
        </div>
        <div id="status">就绪</div>
        <div id="transcriptBox"></div>
    </div>

    <script src="client.js"></script>
</body>
</html>

4.2 前端交互逻辑

// public/client.js
let mediaRecorder;
let socket;
let audioChunks = [];

document.getElementById('startBtn').addEventListener('click', startRecording);
document.getElementById('stopBtn').addEventListener('click', stopRecording);

function startRecording() {
    navigator.mediaDevices.getUserMedia({ audio: true })
        .then(stream => {
            mediaRecorder = new MediaRecorder(stream);
            socket = new WebSocket('ws://localhost:3000');
            
            socket.onopen = () => {
                updateStatus('已连接到服务器,正在识别...');
                document.getElementById('startBtn').disabled = true;
                document.getElementById('stopBtn').disabled = false;
            };

            socket.onmessage = (event) => {
                const result = JSON.parse(event.data);
                updateTranscriptBox(result.text);
            };

            mediaRecorder.ondataavailable = (event) => {
                if (event.data.size > 0 && socket.readyState === WebSocket.OPEN) {
                    socket.send(event.data);
                }
            };

            mediaRecorder.start(100); // 每100ms发送一次音频片段
        })
        .catch(error => {
            updateStatus(`录音权限被拒绝: ${error.message}`);
        });
}

function stopRecording() {
    mediaRecorder.stop();
    socket.close();
    document.getElementById('startBtn').disabled = false;
    document.getElementById('stopBtn').disabled = true;
    updateStatus('识别已停止');
}

function updateTranscriptBox(text) {
    const box = document.getElementById('transcriptBox');
    box.innerHTML += text + '\n';
}

function updateStatus(message) {
    document.getElementById('status').textContent = message;
}

5. 完整项目实现

5.1 项目目录结构

vosk-web-app/
├── public/
│   ├── index.html
│   ├── client.js
│   └── styles.css
├── server.js
├── audio-processor.js
├── package.json
└── model/           # 语音模型目录

5.2 依赖配置

创建package.json

{
  "name": "vosk-web-app",
  "version": "1.0.0",
  "dependencies": {
    "vosk": "^0.3.50",
    "express": "^4.18.2",
    "ws": "^8.13.0",
    "audiojs": "^1.0.0",
    "mic": "^2.1.2"
  }
}

5.3 模型下载与配置

# 创建模型目录
mkdir model && cd model

# 下载中文语音模型(示例)
wget https://alphacephei.com/vosk/models/vosk-model-small-cn-0.15.zip
unzip vosk-model-small-cn-0.15.zip
mv vosk-model-small-cn-0.15/* .

6. 运行与测试

6.1 启动应用

# 安装依赖
npm install

# 启动服务器
node server.js

6.2 功能测试流程

  1. 访问 http://localhost:3000
  2. 点击"开始识别"按钮并授予麦克风权限
  3. 开始说话,实时查看识别结果
  4. 点击"停止识别"结束会话

6.3 常见问题排查

问题 解决方案
模型文件缺失 检查model目录是否包含完整模型文件
音频格式错误 使用ffmpeg转换音频为16kHz单声道PCM格式
识别速度慢 降低前端发送音频的频率或使用更小的模型
中文识别准确率低 更换为vosk-model-cn-0.22等更大的模型

7. 性能优化与扩展

7.1 前端优化策略

// 优化后的音频处理
function optimizeAudioStream(stream) {
    const context = new AudioContext({ sampleRate: 16000 });
    const source = context.createMediaStreamSource(stream);
    const processor = context.createScriptProcessor(4096, 1, 1);
    
    source.connect(processor);
    processor.connect(context.destination);
    
    processor.onaudioprocess = (e) => {
        const inputData = e.inputBuffer.getChannelData(0);
        // 发送处理后的音频数据
        sendAudioData(inputData);
    };
}

7.2 多语言支持实现

// 多语言切换功能
function loadModel(language) {
    const modelPaths = {
        'zh': 'model-cn',
        'en': 'model-en',
        'ja': 'model-ja'
    };
    
    if (modelPaths[language]) {
        model.free(); // 释放当前模型
        model = new vosk.Model(modelPaths[language]);
        return true;
    }
    return false;
}

8. 部署与发布

8.1 本地部署

# 安装生产依赖
npm install --production

# 使用PM2启动服务
npm install -g pm2
pm2 start server.js --name "vosk-web-app"

8.2 服务器部署注意事项

  1. 确保服务器有足够的存储空间存放模型文件
  2. 配置HTTPS以支持浏览器麦克风API(生产环境)
  3. 使用Nginx作为反向代理提高性能:
server {
    listen 80;
    server_name yourdomain.com;
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
    }
}

9. 总结与展望

9.1 项目成果回顾

本文基于Vosk-api构建了一个完整的Web语音识别应用,实现了:

  • 浏览器端音频采集与实时传输
  • Node.js后端语音识别处理
  • 实时文字转录与显示
  • 多语言支持架构设计

9.2 后续开发方向

  1. 实现离线模式支持,使用Service Worker缓存模型
  2. 添加语音合成(TTS)功能,构建完整对话系统
  3. 集成用户词典功能,支持专业术语自定义
  4. 开发移动端适配界面,优化触摸操作体验

9.3 学习资源推荐

  • Vosk官方文档:项目内README.md
  • Web Audio API:MDN Web文档
  • Node.js流处理:Node.js官方文档

通过本项目,你已掌握将Vosk-api与Web技术结合的核心能力,可进一步扩展功能以满足特定业务需求。

【免费下载链接】vosk-api vosk-api: Vosk是一个开源的离线语音识别工具包,支持20多种语言和方言的语音识别,适用于各种编程语言,可以用于创建字幕、转录讲座和访谈等。 【免费下载链接】vosk-api 项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐