基于NodeJS的SenseVoice-Small语音识别API服务开发

张开发
2026/4/19 14:33:13 15 分钟阅读

分享文章

基于NodeJS的SenseVoice-Small语音识别API服务开发
基于NodeJS的SenseVoice-Small语音识别API服务开发语音识别技术正在改变我们与设备交互的方式而构建一个稳定高效的语音识别API服务是很多开发者的实际需求。本文将带你用NodeJS和Express框架快速搭建一个基于SenseVoice-Small模型的RESTful语音识别服务。1. 项目概述与应用场景语音识别API服务在现代应用中扮演着越来越重要的角色。无论是语音助手、会议转录还是客服系统的语音处理都需要一个可靠的后端服务来支持。SenseVoice-Small是一个轻量级的语音识别模型它在保证识别准确率的同时具有较快的推理速度非常适合API服务的部署。相比于大型模型SenseVoice-Small在资源消耗和响应速度方面都有明显优势特别适合中小规模的语音处理需求。在实际应用中这样的API服务可以用于语音转文字工具将用户上传的音频文件转换为文字内容实时语音识别配合WebSocket实现近实时的语音识别批量音频处理一次性处理多个音频文件提高工作效率第三方系统集成为其他应用提供语音识别能力2. 环境准备与项目初始化2.1 NodeJS安装及环境配置首先确保你的系统已经安装了NodeJS。建议使用LTS版本以获得更好的稳定性和兼容性。你可以在终端中运行以下命令检查当前版本node --version npm --version如果还没有安装可以从NodeJS官网下载安装包或者使用nvmNode Version Manager来管理多个NodeJS版本。2.2 创建项目并安装依赖创建一个新的项目目录并初始化npm项目mkdir voice-recognition-api cd voice-recognition-api npm init -y安装项目所需的核心依赖npm install express multer fluent-ffmpeg ffmpeg-static npm install axios form-data npm install --save-dev nodemon这些依赖包的作用分别是expressWeb框架用于构建API接口multer处理文件上传的中间件fluent-ffmpeg处理音频格式转换axios用于向语音识别服务发送请求3. 核心API服务开发3.1 Express服务器基础搭建我们先创建一个基本的Express服务器设置必要的中间件和路由const express require(express); const multer require(multer); const fs require(fs); const path require(path); const axios require(axios); const ffmpeg require(fluent-ffmpeg); const app express(); const port process.env.PORT || 3000; // 中间件配置 app.use(express.json({ limit: 50mb })); app.use(express.urlencoded({ extended: true })); // 文件上传配置 const storage multer.diskStorage({ destination: function (req, file, cb) { const uploadDir uploads/; if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir); } cb(null, uploadDir); }, filename: function (req, file, cb) { cb(null, Date.now() - file.originalname); } }); const upload multer({ storage: storage }); // 健康检查接口 app.get(/health, (req, res) { res.json({ status: ok, timestamp: new Date().toISOString() }); }); app.listen(port, () { console.log(语音识别API服务运行在端口 ${port}); });3.2 音频处理与格式转换语音识别服务通常对音频格式有特定要求。我们需要添加音频预处理功能// 音频格式转换函数 function convertAudio(inputPath, outputPath) { return new Promise((resolve, reject) { ffmpeg(inputPath) .audioCodec(pcm_s16le) .audioFrequency(16000) .audioChannels(1) .format(wav) .on(end, () { console.log(音频转换完成); resolve(outputPath); }) .on(error, (err) { console.error(音频转换错误:, err); reject(err); }) .save(outputPath); }); } // 清理临时文件 function cleanupFiles(...files) { files.forEach(file { if (fs.existsSync(file)) { fs.unlinkSync(file); } }); }3.3 语音识别API接口实现现在实现核心的语音识别接口app.post(/api/recognize, upload.single(audio), async (req, res) { try { if (!req.file) { return res.status(400).json({ error: 请提供音频文件 }); } const inputPath req.file.path; const outputPath converted/${Date.now()}.wav; // 确保转换目录存在 if (!fs.existsSync(converted/)) { fs.mkdirSync(converted/); } // 转换音频格式 await convertAudio(inputPath, outputPath); // 读取转换后的音频文件 const audioBuffer fs.readFileSync(outputPath); // 调用SenseVoice-Small识别服务 const recognitionResult await callRecognitionService(audioBuffer); // 清理临时文件 cleanupFiles(inputPath, outputPath); res.json({ success: true, text: recognitionResult, duration: req.file.size // 简单示例实际应计算音频时长 }); } catch (error) { console.error(识别处理错误:, error); // 确保出错时也清理文件 if (req.file) cleanupFiles(req.file.path); res.status(500).json({ error: 语音识别处理失败 }); } }); // 调用语音识别服务 async function callRecognitionService(audioBuffer) { // 这里需要根据实际的SenseVoice-Small服务地址和API格式进行调整 const formData new FormData(); formData.append(audio, audioBuffer, { filename: audio.wav }); try { const response await axios.post(http://sensevoice-service:8000/recognize, formData, { headers: formData.getHeaders(), timeout: 30000 // 30秒超时 }); return response.data.text; } catch (error) { console.error(识别服务调用失败:, error.message); throw new Error(语音识别服务暂时不可用); } }4. 高级功能与性能优化4.1 并发请求处理为了提高API的并发处理能力我们可以引入队列机制和连接池const { Queue } require(bull); // 创建处理队列 const recognitionQueue new Queue(voice-recognition, { redis: { host: localhost, port: 6379 } }); // 队列处理器 recognitionQueue.process(async (job) { const { audioPath } job.data; // 这里实现具体的识别逻辑 return await processRecognition(audioPath); }); // 修改API接口使用队列 app.post(/api/recognize/async, upload.single(audio), async (req, res) { const job await recognitionQueue.add({ audioPath: req.file.path, timestamp: new Date() }); res.json({ jobId: job.id, status: queued, message: 识别任务已加入队列 }); }); // 查询任务状态 app.get(/api/job/:id, async (req, res) { const job await recognitionQueue.getJob(req.params.id); res.json(job); });4.2 音频预处理优化添加更多的音频预处理选项提高识别准确率function enhanceAudioQuality(inputPath, outputPath) { return new Promise((resolve, reject) { ffmpeg(inputPath) .audioFilters([ highpassf300, // 高通滤波去除低频噪声 lowpassf3000, // 低通滤波去除高频噪声 volume2.0 // 音量增益 ]) .audioCodec(pcm_s16le) .audioFrequency(16000) .audioChannels(1) .format(wav) .on(end, resolve) .on(error, reject) .save(outputPath); }); }5. 错误处理与日志记录完善的错误处理和日志记录对于生产环境至关重要// 错误处理中间件 app.use((error, req, res, next) { console.error(未处理的错误:, error); // 记录详细错误日志 const errorLog { timestamp: new Date().toISOString(), url: req.url, method: req.method, error: error.message, stack: error.stack }; fs.appendFileSync(errors.log, JSON.stringify(errorLog) \n); res.status(500).json({ error: 服务器内部错误, requestId: req.id // 可用于追踪具体请求 }); }); // 请求日志中间件 app.use((req, res, next) { const start Date.now(); res.on(finish, () { const duration Date.now() - start; console.log(${new Date().toISOString()} | ${req.method} ${req.url} | ${res.statusCode} | ${duration}ms); }); next(); });6. 部署与测试建议6.1 环境配置管理使用环境变量来管理配置提高代码的可移植性// config.js require(dotenv).config(); module.exports { port: process.env.PORT || 3000, redis: { host: process.env.REDIS_HOST || localhost, port: process.env.REDIS_PORT || 6379 }, recognitionService: { url: process.env.RECOGNITION_SERVICE_URL || http://localhost:8000, timeout: parseInt(process.env.RECOGNITION_TIMEOUT) || 30000 }, upload: { maxSize: process.env.MAX_UPLOAD_SIZE || 50mb, allowedTypes: [audio/mpeg, audio/wav, audio/mp4, audio/x-m4a] } };6.2 API测试示例使用curl或Postman测试API接口# 测试健康检查 curl http://localhost:3000/health # 测试语音识别 curl -X POST -F audiotest.wav http://localhost:3000/api/recognize # 测试异步识别 curl -X POST -F audiotest.wav http://localhost:3000/api/recognize/async7. 总结搭建基于NodeJS的语音识别API服务其实并不复杂关键是处理好音频预处理、错误处理和性能优化这几个环节。SenseVoice-Small作为一个轻量级模型很适合用来构建这样的服务它在保证识别质量的同时对服务器资源的要求相对较低。在实际使用中你可能还需要考虑更多细节比如身份验证、速率限制、监控告警等。这个基础框架可以作为一个起点根据你的具体需求进行扩展和优化。如果遇到性能瓶颈可以考虑引入负载均衡或者将音频处理任务转移到专门的worker进程中。最重要的是记得做好错误处理和日志记录这样在出现问题时能够快速定位和解决。语音识别服务往往需要处理各种格式的音频文件强大的预处理和容错机制是保证服务稳定性的关键。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章