当前位置: 首页 > news >正文

微信小程序接口实现语音转文字

一、效果展示

我们有一个按钮,点击“开始录音”按钮,此时按钮变成“停止录音”并开始计时,点击停止录音后,界面上即可展示返回的文字
在这里插入图片描述

二、代码实现

完整代码实现见github

1.小程序端代码

// index.js
const recorderManager = wx.getRecorderManager();Page({data: {recordState: false,  // 录音状态recordTime: 0,       // 录音时长voices: [],          // 语音消息列表},// 开始录音startRecord() {const options = {duration: 60000, // 最长录音时间,单位mssampleRate: 16000,numberOfChannels: 1,encodeBitRate: 48000,format: 'mp3',};recorderManager.start(options);this.setData({ recordState: true, recordTime: 0 });this.startTimer();recorderManager.onStart(() => {console.log('recorder start');});recorderManager.onError((res) => {console.error('recorder error:', res);});},// 停止录音stopRecord() {recorderManager.stop();this.setData({ recordState: false });this.clearTimer();recorderManager.onStop((res) => {console.log('recorder stop', res);this.uploadVoice(res.tempFilePath);});},// 上传语音文件并转换为文本uploadVoice(filePath) {wx.showLoading({ title: '识别中...' });wx.uploadFile({url: 'http://localhost:3000/upload', // 替换为你的服务器地址filePath: filePath,name: 'file',success: (res) => {wx.hideLoading();const data = JSON.parse(res.data);if (data.text) {this.setData({voices: [...this.data.voices, { type: 'text', content: data.text }]});}},fail: (error) => {wx.hideLoading();console.error('Upload failed', error);wx.showToast({title: '上传失败',icon: 'none'});}});},// 开始计时器startTimer() {this.timer = setInterval(() => {this.setData({ recordTime: this.data.recordTime + 1 });}, 1000);},// 清除计时器clearTimer() {if (this.timer) {clearInterval(this.timer);this.timer = null;}},// 组件生命周期函数onUnload() {this.clearTimer();}
});

2.服务端代码

const path = require('path');
const fs = require('fs');
const express = require('express');
const axios = require('axios');
const multer = require('multer');
const FormData = require('form-data');require('dotenv').config();
const { APP_ID, APP_SECRET, PORT } = process.env// 确保 uploads 目录存在
const uploadsDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadsDir)) {fs.mkdirSync(uploadsDir);
}const app = express();// 替换为你的 AppID 和 AppSecret
const appId = APP_ID;
const appSecret = APP_SECRET;// 配置 multer 来处理文件上传
const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, 'uploads/')},filename: function (req, file, cb) {cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))}
});const upload = multer({ storage: storage });// 获取 ACCESS_TOKEN 的函数
async function getAccessToken() {const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`;try {const response = await axios.get(url);console.log('Access token response:', response.data);if (response.data.access_token) {return response.data.access_token;} else {throw new Error('Failed to get access token');}} catch (error) {console.error('Error getting access token:', error);return null;}
}// 调用微信语音识别接口
async function recognizeSpeech(accessToken, filePath) {try {console.log('Reading file:', filePath);// const fileContent = fs.readFileSync(filePath);// const base64Audio = fileContent.toString('base64');const form = new FormData();form.append('media', fs.createReadStream(filePath));const voice_id = Date.now().toString();const url = `https://api.weixin.qq.com/cgi-bin/media/voice/addvoicetorecofortext?access_token=${accessToken}&format=mp3&voice_id=${voice_id}&lang=zh_CN`console.log('Calling WeChat API...', url);const response = await axios.post(url,form,{headers: form.getHeaders(),});console.log('WeChat API response:', response.data);if (response.data.errcode) {throw new Error(`WeChat API error: ${response.data.errmsg}`);}const queryRecoresultUrl = `https://api.weixin.qq.com/cgi-bin/media/voice/queryrecoresultfortext?access_token=${accessToken}&voice_id=${voice_id}&lang=zh_CN`const res = await axios.post(queryRecoresultUrl,{},{headers: { 'Content-Type': 'application/json' }});console.log('xxxxx', res.data)return res.data.result;} catch (error) {console.error('Error recognizing speech:', error);throw error;}
}// 处理语音文件上传和识别
app.post('/upload', upload.single('file'), async (req, res) => {if (!req.file) {return res.status(400).send('No file uploaded.');}console.log('File uploaded:', req.file);try {let accessToken;let recognitionResult;let retries = 1;while (retries > 0) {try {accessToken = await getAccessToken();console.log('Got access token:', accessToken);recognitionResult = await recognizeSpeech(accessToken, `uploads/0.mp3`);console.log('Recognition result:', recognitionResult);break;} catch (error) {console.error(`Attempt failed, retries left: ${retries - 1}`, error);retries--;if (retries === 0) throw error;await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒后重试}}// 删除临时文件fs.unlinkSync(req.file.path);res.json({ text: recognitionResult });} catch (error) {console.error('Error:', error);res.status(500).send('Server error: ' + error.message);}
});// 启动服务器
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});

三、返回示例

在这里插入图片描述

四、遗留问题

可能由于个人水平问题,有以后遗留问题,如果大家解决方案或问题,欢迎随时交流

  1. 此代码在服务端写死了一个待转换的mp3文件,因为开发环境本底录音无法试听
  2. 录音不知道什么原因,可能会有一半不会被翻译,暂时没有找到解决方案
  3. 多次上传同一个录音后,会返回空的转换结果

相关文章:

微信小程序接口实现语音转文字

一、效果展示 我们有一个按钮,点击“开始录音”按钮,此时按钮变成“停止录音”并开始计时,点击停止录音后,界面上即可展示返回的文字 二、代码实现 完整代码实现见github 1.小程序端代码 // index.js const recorderManager…...

[Spark Streaming] 读取 Kafka 消息, 插入到 MySQL

以下是一个简单的使用 Spark Streaming 读取 Kafka 消息、统计数据后插入到 MySQL 中的 Scala 代码示例: import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, StreamingContext} import org.apache.spark.streaming.kafka.KafkaUtils…...

精选3款国内wordpress 主题,建站首选

WordPress作为一款功能强大且易于使用的建站平台,已经成为了许多企业和个人搭建网站的首选。为了帮助大家更好地选择适合自己的WordPress主题,小编将为大家推荐三款国内优秀的WordPress主题:子比主题、OneNav主题和RiTheme主题。 1.子比主题…...

JavaScript之 Uint8Array 类型数组(solana pda场景中的大小端)

文章目录 JavaScript之 Uint8Array 类型数组numberToUint8Array 数字转换为Uint8Array为什么要把数字转换为Uint8Array数字转换为Uint8Array的大小端问题solana pda场景中的大小端JavaScript之 Uint8Array 类型数组 Uint8Array 数组类型表示一个8位无符号整型数组,创建时内容…...

《Windows API每日一练》24.1 WinSock简介

本节将逐一介绍WinSock的主要特性和组件,套接字、WinSock动态库的使用。 本节必须掌握的知识点: Windows Socket接口简介 Windows Socket接口的使用 第178练:网络时间校验 24.1.1 Windows Socket接口简介 ■以下是WinSock的主要特性和组件…...

openwrt编译Dockerfile

一、Dockerfile FROM ubuntu:20.04ENV TZAsia/ShanghaiRUN apt-get update && \apt-get install -y --no-install-recommends tzdata && \ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \dpkg-reconfigure --frontend noninteractive tzdata &am…...

【C语言】分支与循环(循环篇)——结尾猜数字游戏实现

前言 C语言是一种结构化的计算机语言,这里指的通常是顺序结构、选择结构、循环结构,掌握这三种结构之后我们就可以解决大多数问题。 分支结构可以使用if、switch来实现,而循环可以使用for、while、do while来实现。 1. while循环 C语言中…...

【数据结构】链表篇

文章目录 1.链表的概念以及结构2.链表的分类2.1 单向或者双向2.2 带头或者不带头2.3 循环或者不循环2.4 无头单向非循环链表和带头双向循环链表 3.单链表的实现3.1 准备工作3.2 节点的创建3.3 单链表的释放3.4 打印链表3.5 单链表的尾插3.6 单链表的尾删3.7 单链表头删3.8 单链…...

Python SciPy介绍

在数据科学和工程领域,Python已经成为了一个不可或缺的工具,这主要得益于其强大的库和框架支持。其中,SciPy库作为Python科学计算的核心库之一,为研究人员、工程师和数据分析师提供了大量高效的算法和数学工具。本文将带您深入了解…...

docker镜像源

1、直接在服务器上创建这个文件,将镜像源配置在里面 /etc/docker/daemon.json {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com&qu…...

【clion】clion打开文件目录卡死问题

巨卡,几乎无法打开,据说是fsnotifier64.exe 被限制了。删除 火绒就好了。 关闭windows defender 官方:关闭 Windows 安全中心中的Defender 防病毒保护 此时,删除火绒: 界面变这样了:...

[CR]厚云填补_GridFormer

GridFormer: Residual Dense Transformer with Grid Structure for Image Restoration in Adverse Weather Conditions Abstract 恶劣天气条件下的图像恢复是计算机视觉中的一个难点。在本文中,我们提出了一种新的基于变压器的框架GridFormer,它可以作为…...

PostgreSQL数据库内核(二):通过initdb传递guc参数

目录 增加guc参数 initdb参数传递 pg_ctl参数传递 参数验证 新增guc参数pg_test_parameter,支持从initdb和pg_ctl命令中传递/覆盖参数,使用场景是TDE透明加密指定算法或者某些定制化需求。 增加guc参数 pg源码是这样描述guc参数的:它是全局…...

rust常用的宏使用记录(九)

matches! 宏使用 matches! 是 Rust 标准库中一个非常有用的宏,它允许你方便地匹配一个表达式的结果是否符合某个模式。它的基本用法如下:matches!(expression, pattern) 这个宏返回一个布尔值,如果 expression 匹配 pattern,则返回…...

【Python机器学习】支持向量机——手写数字识别问题

基于SVM的数字识别步骤: 1、收集数据:提供的文本文件 2、准备数据:基于二值图像构造向量 3、分析数据:对图像向量进行目测 4、训练算法:采用两种不同的核函数,并对径向基核函数采用不同的设置来运行SMO算法…...

学习笔记-Cookie、Session、JWT

目录 一、验证码的生成与校验 1. 创建生成验证码的工具类 2. 写一个 Controller 3. 实现验证码验证 1. 获取验证码 2. 验证码请求过程 3. 验证码的校验 4. 原理说明 5. 验证 6. 总结 二、JWT登录鉴权 1. 为什么要做登录鉴权? 2. 什么是 JWT 3. JWT相比…...

题海战术,面试必胜秘诀

目录 1.Java 的优势是什么?2.什么是 Java 的多态特性?3.Java 中的参数传递是按值还是按引用?4.为什么 Java 不支持多重继承?5.什么是 Java 中的不可变类?总结 题目 来自面试鸭刷题神器 1.Java 的优势是什么? Java 的跨平台性、垃圾回收机制以及其强…...

设计模式详解(十九)——命令模式

命令模式简介 命令模式定义 命令模式(Command Pattern)是一种在面向对象程序设计中常用的行为型设计模式。命令模式的核心思想在于将请求封装成一个对象,从而使发出请求的责任和执行请求的责任分割开。它可以让请求发送者和请求接收者之间消…...

实战:MySQL数据同步神器之Canal

1.概叙 场景一:数据增量实时同步 项目中业务数据量比较大,每类业务表都达到千万级别,虽然做了分库分表,每张表数据控制在300W以下,但是效率还是达不到要求,为了提高查询效率,打算使用ES进行数…...

5.6软件工程-运维

运维 系统转换系统维护系统评价练习题 系统转换 新老系统的转换 系统转换是指:新系统开发完毕,投入运行,取代现有系统的过程,需要考虑多方面的问题,以实现与老系统的交接,有一下三种转换计划: …...

工业物联网通信技术:iCOMOX平台与三大方案解析

1. iCOMOX平台与工业物联网通信技术概述在工业4.0和智能制造的浪潮中,设备状态监测(CbM)系统正经历从传统定期维护到预测性维护的范式转变。iCOMOX作为一款开源的传感器融合平台,集成了振动、声音、温度和磁场位移等多模态传感能力,其核心价值…...

Baichuan-7B开源大模型:从环境搭建、推理调优到LoRA微调实战

1. 项目概述:一个值得深入研究的开源大语言模型最近在开源社区里,Baichuan-7B这个名字的讨论热度一直不低。作为一个长期关注大模型技术动向的从业者,我自然也对它进行了一番深入的“把玩”和研究。简单来说,Baichuan-7B是由百川智…...

闲置烽火HG680L变身全能播放器:S905L-3B芯片刷机后安装EmuELEC游戏系统+CoreELEC影音库

闲置烽火HG680L改造指南:打造全能家庭娱乐终端 家里角落积灰的烽火HG680L机顶盒,其实是一块被低估的硬件宝藏。搭载Amlogic S905L-3B芯片的它,性能远超普通电视盒子。通过巧妙改造,不仅能流畅运行复古游戏系统,还能变身…...

为你的Nodejs后端服务快速集成大模型能力

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为你的Nodejs后端服务快速集成大模型能力 当你的Node.js应用需要添加智能对话或内容生成功能时,直接对接各大模型厂商的…...

Atlassian Agent:企业级Atlassian产品激活的终极解决方案

Atlassian Agent:企业级Atlassian产品激活的终极解决方案 【免费下载链接】atlassian-agent Atlassians productions crack. 项目地址: https://gitcode.com/gh_mirrors/at/atlassian-agent Atlassian Agent是一款专为JIRA、Confluence等Atlassian产品设计的…...

1.8.2 掌握Scala类与对象 - 单例对象与伴生对象

本次实战通过三个案例深入解析了 Scala 中 object 的核心机制,展示了其如何替代 Java 的 static 关键字。首先,通过 MathUtils 定义了存放常量与工具方法的独立单例对象;其次,利用 Person 类与其同名对象演示了“伴生对象”特性&a…...

Angular 17与Firebase全栈实战:从零构建现代化Web应用

1. 项目概述:一个基于 Angular 17 的现代化 Web 应用最近接手并重构了一个名为 Ditectrev 的 Web 项目,它本质上是一个功能性的前端应用,旨在解决特定领域的信息展示与交互需求。这个项目最初由 Angular CLI 17.3.17 生成,但原始的…...

Cortex-R52性能监控与调试架构深度解析

1. Cortex-R52性能监控单元架构解析在嵌入式实时系统中,性能监控单元(PMU)如同汽车的仪表盘,为开发者提供处理器内部运行状态的实时数据。Cortex-R52的PMU模块采用三级监控架构:1.1 事件采集层处理器内部部署了45个专用硬件计数器&#xff0c…...

【限时解禁】Google I/O 2024未发布的Gemini Android Enterprise Integration白皮书核心章节(仅剩37份授权访问码)

更多请点击: https://intelliparadigm.com 第一章:Gemini Android深度整合的战略定位与演进脉络 Google 将 Gemini 模型深度嵌入 Android 生态,并非单纯叠加 AI 功能,而是重构操作系统级智能代理的交互范式。其战略内核在于将大模…...

终极小说下载器:一键离线收藏100+小说网站完整指南

终极小说下载器:一键离线收藏100小说网站完整指南 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代,你是否曾为心爱的小说突然消失而烦恼&#…...