【微信小程序变通实现DeepSeek支持语音】

微信小程序实现录音转文字,并调用后端服务(Node.js)进行语音识别和,然后调用DeepSeek 处理的完整实现。

整体架构

  1. 前端(微信小程序):
    • 实现录音功能。
    • 将录音文件上传到后端。
    • 接收后端返回的语音识别结果,并显示在可编辑的文本框中。
    • 调用 DeepSeek 处理文本。
  2. 后端(Node.js):
    • 接收小程序上传的录音文件。
    • 调用腾讯云语音识别(ASR)服务,将语音转换为文字。
    • 返回识别结果给小程序。
    • 提供 DeepSeek 处理接口。

步骤 1:后端开发(Node.js)

1. 项目结构

复制

backend/
├── server.js            # 主入口文件
├── config.js            # 配置文件
├── asrService.js        # 腾讯云语音识别服务
├── deepseekService.js   # DeepSeek 处理服务
└── package.json         # 依赖文件
2. 安装依赖

bash

复制

npm install express multer tencentcloud-sdk-nodejs axios
3. 配置文件 (config.js)

javascript

复制

module.exports = {tencentCloud: {secretId: 'your-tencent-secret-id', // 腾讯云 SecretIdsecretKey: 'your-tencent-secret-key', // 腾讯云 SecretKeyregion: 'ap-guangzhou' // 腾讯云区域},deepseek: {apiKey: 'your-deepseek-api-key', // DeepSeek API 密钥apiUrl: 'https://api.deepseek.com/v1/chat/completions' // DeepSeek API 地址}
};
4. 腾讯云语音识别服务 (asrService.js)

javascript

复制

const tencentcloud = require('tencentcloud-sdk-nodejs');
const AsrClient = tencentcloud.asr.v20190614.Client;
const { tencentCloud } = require('./config');const client = new AsrClient({credential: {secretId: tencentCloud.secretId,secretKey: tencentCloud.secretKey,},region: tencentCloud.region,profile: {httpProfile: {endpoint: 'asr.tencentcloudapi.com',},},
});/*** 调用腾讯云语音识别* @param {string} audioBase64 - 音频文件的 base64 数据* @returns {Promise<string>} - 识别结果*/
async function recognizeAudio(audioBase64) {const params = {EngineModelType: '16k_zh', // 16k 中文普通话VoiceFormat: 'wav',        // 音频格式Data: audioBase64          // 音频数据};const response = await client.SentenceRecognition(params);return response.Result;
}module.exports = { recognizeAudio };
5. DeepSeek 处理服务 (deepseekService.js)

javascript

复制

const axios = require('axios');
const { deepseek } = require('./config');/*** 调用 DeepSeek 处理文本* @param {string} text - 需要处理的文本* @returns {Promise<string>} - 处理结果*/
async function processText(text) {const response = await axios.post(deepseek.apiUrl,{model: 'deepseek-chat',messages: [{ role: 'system', content: '你是一个文本处理助手。' },{ role: 'user', content: text }]},{headers: {'Content-Type': 'application/json','Authorization': `Bearer ${deepseek.apiKey}`}});return response.data.choices[0].message.content;
}module.exports = { processText };
6. 主入口文件 (server.js)

javascript

复制

const express = require('express');
const multer = require('multer');
const { recognizeAudio } = require('./asrService');
const { processText } = require('./deepseekService');
const path = require('path');const app = express();
const upload = multer({ dest: 'uploads/' }); // 临时存储上传文件// 语音识别接口
app.post('/api/recognize', upload.single('audio'), async (req, res) => {try {const filePath = req.file.path;const fileData = require('fs').readFileSync(filePath, { encoding: 'base64' });const result = await recognizeAudio(fileData);res.json({ success: true, data: result });} catch (error) {res.status(500).json({ success: false, message: error.message });}
});// DeepSeek 处理接口
app.post('/api/process', express.json(), async (req, res) => {try {const { text } = req.body;const result = await processText(text);res.json({ success: true, data: result });} catch (error) {res.status(500).json({ success: false, message: error.message });}
});// 启动服务器
const PORT = 3000;
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});

步骤 2:前端开发(微信小程序)

1. 项目结构

复制

miniprogram/
├── pages/
│   ├── index/
│   │   ├── index.js       # 页面逻辑
│   │   ├── index.wxml     # 页面结构
│   │   └── index.wxss     # 页面样式
├── app.js                 # 小程序逻辑
├── app.json               # 小程序配置
└── app.wxss               # 全局样式
2. 页面逻辑 (index.js)

javascript

复制

const app = getApp();Page({data: {isRecording: false,      // 是否正在录音recordTime: 0,           // 录音时长resultText: '',          // 识别结果editedText: '',          // 编辑后的文本isLoading: false         // 加载状态},// 开始录音startRecord() {this.setData({ isRecording: true, recordTime: 0 });this.recorderManager = wx.getRecorderManager();this.recorderManager.start({format: 'wav',         // 录音格式sampleRate: 16000,     // 采样率numberOfChannels: 1,   // 声道数encodeBitRate: 48000   // 编码码率});this.timer = setInterval(() => {this.setData({ recordTime: this.data.recordTime + 1 });}, 1000);this.recorderManager.onStop((res) => {clearInterval(this.timer);this.setData({ isRecording: false });this.uploadAudio(res.tempFilePath); // 上传录音文件});},// 停止录音stopRecord() {if (this.recorderManager) {this.recorderManager.stop();}},// 上传录音文件uploadAudio(filePath) {this.setData({ isLoading: true });wx.uploadFile({url: 'http://localhost:3000/api/recognize', // 后端语音识别接口filePath: filePath,name: 'audio',success: (res) => {const result = JSON.parse(res.data);if (result.success) {this.setData({ resultText: result.data, editedText: result.data });} else {wx.showToast({ title: '识别失败', icon: 'none' });}},fail: (err) => {wx.showToast({ title: '上传失败', icon: 'none' });},complete: () => {this.setData({ isLoading: false });}});},// 编辑文本handleEditText(e) {this.setData({ editedText: e.detail.value });},// 调用 DeepSeek 处理文本processText() {const { editedText } = this.data;if (!editedText) {wx.showToast({ title: '请输入文本', icon: 'none' });return;}this.setData({ isLoading: true });wx.request({url: 'http://localhost:3000/api/process', // 后端 DeepSeek 处理接口method: 'POST',data: { text: editedText },success: (res) => {if (res.data.success) {this.setData({ resultText: res.data.data });} else {wx.showToast({ title: '处理失败', icon: 'none' });}},fail: (err) => {wx.showToast({ title: '网络错误', icon: 'none' });},complete: () => {this.setData({ isLoading: false });}});}
});
3. 页面结构 (index.wxml)

xml

复制

<view class="container"><!-- 录音按钮 --><view class="record-button"><buttonbindtap="{{isRecording ? 'stopRecord' : 'startRecord'}}"class="{{isRecording ? 'stop-button' : 'start-button'}}">{{isRecording ? '停止录音' : '开始录音'}}</button><text class="record-time" wx:if="{{isRecording}}">{{recordTime}}s</text></view><!-- 识别结果 --><view class="result-box"><text class="result-title">识别结果:</text><textareavalue="{{editedText}}"bindinput="handleEditText"placeholder="识别结果将显示在这里"class="result-text"></textarea></view><!-- 处理按钮 --><button bindtap="processText" class="process-button">调用 DeepSeek 处理</button><!-- 处理结果 --><view class="result-box"><text class="result-title">处理结果:</text><textareavalue="{{resultText}}"placeholder="处理结果将显示在这里"disabledclass="result-text"></textarea></view><!-- 加载状态 --><view class="loading" wx:if="{{isLoading}}"><text>处理中...</text></view>
</view>

运行 HTML

4. 页面样式 (index.wxss)

css

复制

.container {padding: 20px;display: flex;flex-direction: column;align-items: center;
}.record-button {display: flex;flex-direction: column;align-items: center;margin-bottom: 20px;
}.start-button {background-color: #07c160;color: white;
}.stop-button {background-color: #f5222d;color: white;
}.record-time {margin-top: 10px;font-size: 14px;color: #666;
}.result-box {width: 100%;margin-top: 20px;
}.result-title {font-size: 16px;font-weight: bold;margin-bottom: 10px;
}.result-text {width: 100%;height: 100px;border: 1px solid #ccc;border-radius: 5px;padding: 10px;font-size: 14px;
}.process-button {margin-top: 20px;background-color: #1890ff;color: white;
}.loading {margin-top: 20px;font-size: 14px;color: #666;
}
5. 小程序配置 (app.json)

json

复制

{"pages": ["pages/index/index"],"window": {"navigationBarTitleText": "录音转文字","navigationBarBackgroundColor": "#07c160","navigationBarTextStyle": "white"}
}

步骤 3:测试

  1. 启动后端服务:

    bash

    复制

    node server.js
    
  2. 在微信开发者工具中运行小程序。

  3. 测试录音、语音识别、文本编辑和 DeepSeek 处理功能。


注意事项

  1. 后端部署:
    • 将后端服务部署到云服务器(如腾讯云、阿里云),并配置 HTTPS。
  2. API 密钥安全:
    • 不要将 API 密钥暴露在前端代码中。
  3. 录音权限:
    • 确保小程序已获取录音权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp常用组件

写在前面 今天将uniapp中的组件都过了一遍&#xff0c;上手难度不大&#xff0c;但是还是遇到了一些问题&#xff1a; HBuilder实在是太难用&#xff0c;不管是插件生态还是设计之类的&#xff0c;总之就是用的哪哪不顺手虽然打开内置浏览器是挺方便的&#xff0c;但是不知道…

【Linux】应用层自定义协议 + 序列化和反序列化

应用层自定义协议 序列化和反序列化 一.应用层1.再谈 "协议"2.序列化 和 反序列化 二. Jsoncpp1.序列化2.反序列化 三. Tcp全双工 面向字节流四.自定义协议 保证报文的完整性1.Makefile2.Mutex.hpp3.Cond.hpp4.Log.hpp5.Thread.hpp6.ThreadPool.hpp7.Common.hpp8.…

二.使用ffmpeg对原始音频数据重采样并进行AAC编码

重采样&#xff1a;将音频三元组【采样率 采样格式 通道数】之中的任何一个或者多个值改变。 一.为什么要进行重采样&#xff1f; 1.原始音频数据和编码器的数据格式不一致 2.播放器要求的和获取的数据不一致 3.方便运算 二.本次编码流程 1.了解自己本机麦克风参数&#x…

器材借用管理系统详细设计基于Spring Boot-SSM

‌ 目录 ‌摘要 一、系统概述‌ ‌二、系统架构设计‌ 2‌.1技术选型‌ ‌2.2系统架构‌ ‌三、需求分析 3.1用户需求分析 3.2功能模块设计‌ 3.3、性能需求分析 3.4、安全需求分析 ‌四、数据库设计‌ ‌五、安全性设计‌ ‌六、系统测试与维护‌ ‌七、总结‌…

麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0

国产自主可控服务器需要访问RocketMQ消息队列&#xff0c;最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题&#xff0c;记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…

C语言每日一练——day_12(最后一天)

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第十二天。&#xff08;最后一天&#xff0c;完结散花啦&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff0…

网络安全应急入门到实战

奇安信&#xff1a;95015网络安全应急响应分析报告&#xff08;2022-2024年&#xff09;官网可以下载 https://github.com/Bypass007/Emergency-Response-Notes 应急响应实战笔记 网络安全应急响应技术实战指南 .pdf 常见场景 第4章 勒索病毒网络安全应急响应 第5章 挖矿木…

jvm中每个类的Class对象是唯一的吗

jvm中每个类的Class对象是唯一的吗 在 Java 中&#xff0c;同一个类的 Class 对象在由同一个类加载器加载时是唯一的。析&#xff1a; 1. 同一类加载器的唯一性 规则&#xff1a;若一个类被同一个类加载器加载&#xff0c;无论创建多少实例&#xff0c;其 Class 对象始终唯一…

Visual Studio里的调试(debugging)功能介绍

参考 1- Introduction to Debugging | Basic Visual Studio Debugging&#xff08;这是一位印度博主视频&#xff0c;我下面做到笔记也主要参考她的视频&#xff0c;但不得不说口音太重了&#xff0c;一股咖喱味&#xff09; 目录 个人对调试浅显的认识和对调试的介绍逐行调…

NLP高频面试题(六)——decoder-only、encoder-only和encoder-decoder的区别与联系

一、基本概念与代表模型 1. Encoder-only 架构 Encoder-only 架构最具代表性的模型是 BERT。BERT 使用 masked language modeling&#xff08;MLM&#xff09;进行预训练&#xff0c;即随机遮蔽部分输入词汇&#xff0c;让模型预测被遮蔽的词汇。由于这种架构能够同时看到输入…

如何判断 MSF 的 Payload 是 Staged 还是 Stageless(含 Meterpreter 与普通 Shell 对比)

在渗透测试领域&#xff0c;Metasploit Framework&#xff08;MSF&#xff09;的 msfvenom 工具是生成 Payload&#xff08;载荷&#xff09;的核心利器。然而&#xff0c;当我们选择 Payload 时&#xff0c;经常会遇到一个问题&#xff1a;这个 Payload 是 Staged&#xff08;…

基于FPGA的3U机箱模拟量高速采样板ADI板卡,应用于轨道交通/电力储能等

板卡简介&#xff1a; 本板为模拟量高速采样板&#xff08;ADI&#xff09;&#xff0c;主要用于电机转速和相电流检测&#xff0c;以实现电机闭环控制。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff0c;DC3.3V&#xff0c;DC15V&#xff0c;DC24V FPGA&#xff1a;…

Gymnasium Cart Pole 环境与 REINFORCE 算法 —— 强化学习入门 2

Title: Gymnasium Cart Pole 环境与 REINFORCE 算法 —— 强化学习入门 2 文章目录 I. Gymnasium Cart Pole 环境II. REINFORCE 算法1. 原理说明2. REINFORCE 算法实现 I. Gymnasium Cart Pole 环境 Gymnasium Cart Pole 环境是一个倒立摆的动力学仿真环境. 状态空间: 0: Ca…

Python高级:GIL、C扩展与分布式系统深度解析

文章目录 &#x1f4cc; **前言**&#x1f527; **第一章&#xff1a;Python语言的本质与生态**1.1 **Python的实现与版本演进**1.2 **开发环境与工具链** &#x1f527; **第二章&#xff1a;元编程与动态特性**2.1 **描述符协议&#xff08;Descriptor Protocol&#xff09;*…

C++学习笔记(二十一)——文件读写

一、文件读写 作用&#xff1a; 文件读写指的是将数据从程序存储到文件&#xff0c;或从文件读取数据&#xff0c;以实现数据的持久化存储。 C 提供了 fstream 头文件&#xff0c;用于文件操作&#xff0c;主要包括&#xff1a; ofstream&#xff08;输出文件流&#xff09;—…

RBA+minibatch的尝试

目录 还是咬着牙来写 RBA了 JAX JAX->TORCH torch tensor的变形 pytorch怎么把一个【3,3,5】的tensor变成【3,10,5】&#xff0c;多的用0填充 pytorch如何把shape【100】转成【100,1】 把torch shape【100,1】变成【100】 SQUEEZE grad_fn 不能两次反向传播 还…

基于Python+Django的二手房信息管理系统

项目介绍 PythonDjango二手房信息管理系统(Pycharm Django Vue Mysql) 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 - 前台功能包括&#xff1a;首页、二手房信息、公告管理、…

爬虫基础之爬取猫眼Top100 可视化

网站: TOP100榜 - 猫眼电影 - 一网打尽好电影 本次案例所需用到的模块 requests (发送HTTP请求) pandas(数据处理和分析 保存数据) parsel(解析HTML数据) pyecharts(数据可视化图表) pymysql(连接和操作MySQL数据库) lxml(数据解析模块) 确定爬取的内容: 电影名称 电影主演…

解决Qt信号在构造函数中失效的问题

情景引入&#xff1a;音乐播放器的“幽灵列表”问题 假设你正在开发一个音乐播放器应用&#xff0c;其中有一个功能是用户首次打开应用时&#xff0c;需要从服务器拉取最新的歌曲列表并显示在“本地音乐”页面中。你可能会写出类似这样的代码&#xff1a; // LocalSong 类的构…

Hadoop 启动,发现 namenode、secondary namenodes,这两个没有启动,报错超时。

今天在启动 hadoop 的时候&#xff0c;发现本应该同时启动的 namenode、secondary namenodes 却都没有启动。我还以为是坏了又重新装了虚拟机&#xff0c;重新下载 Hadoop 重新配置结果还是同样的问题&#xff0c;那没办法只能去解决问题了。 首先先再次尝试启动看他报错是什么…