FUTURE POLICE语音模型与微信小程序开发结合打造个人语音日记本你有没有过这样的时刻一天下来心里积攒了很多话想写下来却又觉得打字太累或者对着空白的文档不知道从何说起。传统的文字日记有时候反而成了一种负担。现在我们可以换一种方式。想象一下你只需要对着手机说说话就像跟朋友聊天一样你的语音不仅能被精准地转换成文字还能被“听懂”背后的情绪——是开心、平静还是有点小烦恼。然后一份带着情感标签的、排版清晰的文字日记就自动生成了。听起来是不是很酷今天我就带你一步步实现这个想法。我们将利用微信小程序作为前端入口在星图GPU平台上部署强大的FUTURE POLICE语音模型作为智能大脑打造一个完全属于你个人的智能语音日记本。整个过程我会用最直白的话讲清楚哪怕你之前没怎么接触过小程序开发或模型部署也能跟着做出来。1. 项目整体思路它到底是怎么工作的在动手写代码之前我们先把这个日记本的工作流程理清楚这样后面每一步你都知道自己在做什么。简单来说这个应用跑通一个完整的“录音-分析-呈现”的闭环你在小程序里说话打开小程序按下录音按钮把今天想说的记录下来。声音传到云端这段录音文件会被安全地上传到我们自己的服务器。AI大脑分析处理服务器收到录音后会调用部署在星图GPU平台上的FUTURE POLICE模型。这个模型干两件核心的事一是把语音转成准确的文字二是分析这段语音里蕴含的情感。结果存起来并返回转写的文字和情感分析结果比如“积极”、“中性”、“消极”会被保存到数据库里同时服务器会整理好这些信息返回给小程序。你看到成型的日记小程序收到数据后就会把文字内容用友好的格式展示出来并且标记上今天的心情状态。你还可以随时回看历史日记。所以我们的开发工作主要分三大块小程序前端、后端服务器和AI模型服务。下面我们就从最核心的AI模型部署开始。2. 核心引擎在星图GPU部署FUTURE POLICE模型我们的日记本聪不聪明全看背后的语音模型。这里我们选择FUTURE POLICE模型因为它通常在语音识别和情感分析上有着不错的综合表现。关键是要把它“安装”到一个能稳定运行且方便我们调用的地方星图GPU平台就很合适。2.1 为什么选择星图GPU平台你可能会问为什么不用自己的电脑原因很简单专业和省心。强大的计算能力语音模型尤其是包含情感分析功能的需要GPU显卡来加速处理。星图平台提供了现成的GPU环境不用你自己买昂贵的显卡。一键式部署平台把很多复杂的环境配置工作都打包好了通过“镜像”的方式让我们能像安装手机APP一样部署模型非常方便。稳定的网络和服务模型需要24小时在线等待小程序调用星图平台能提供稳定的网络和运行环境比自己维护一台电脑做服务器可靠得多。2.2 一步步部署模型这个过程其实比想象中简单我们一步步来。首先你需要登录星图GPU平台。在控制台里找到创建实例或部署服务的入口。关键的一步是选择“镜像”。你可以直接搜索“FUTURE POLICE”或相关的语音处理镜像。平台可能会提供多个版本选择那个标注了“语音识别”、“语音情感分析”或类似功能的、最近更新过的镜像。选好镜像后需要配置一下实例的资源。对于我们的语音日记应用初期用户量不大的话选择一款中等配置的GPU比如平台标注的“性价比型”或“入门GPU型”就完全够用了。接着设置一下实例的名称比如可以叫voice-diary-ai-core。配置完成后点击创建或部署。平台需要几分钟时间来拉取镜像并启动所有服务。当你在控制台看到实例状态变成“运行中”时就成功了一大半。部署成功后平台通常会提供一个访问地址一个URL链接和必要的端口信息。这个URL就是我们小程序的服务器将来要“敲门”的地方。请务必记好这个地址比如http://your-instance-ip:port。2.3 测试模型接口模型服务跑起来之后我们得先确认它能不能正常工作。最直接的方法就是调用它的接口试试。通常这类语音模型会提供一个HTTP API接口。我们可以用一个简单的Python脚本来做测试。你需要准备一个短的、清晰的.wav或.mp3格式的录音文件。import requests # 替换成你从星图平台获取的真实模型服务地址 model_service_url http://your-instance-ip:port/v1/audio/analysis # 准备要发送的音频文件 audio_file_path test_hello.wav with open(audio_file_path, rb) as f: files {audio: f} # 可能还需要一些额外的参数具体看模型API文档 data {task: asr_and_sentiment} response requests.post(model_service_url, filesfiles, datadata) if response.status_code 200: result response.json() print(语音转写结果, result.get(text, N/A)) print(情感分析结果, result.get(sentiment, N/A)) else: print(请求失败状态码, response.status_code) print(错误信息, response.text)运行这个脚本如果能看到返回了你录音的文字内容和情感标签那么恭喜你最核心的AI引擎已经准备就绪随时可以调用。3. 搭建桥梁开发后端服务器现在AI大脑已经在线了但它还不能直接跟微信小程序“对话”。我们需要一个中间人也就是后端服务器来接收小程序的请求转发给AI模型然后再把结果整理好送回小程序。这里我们用Python的Flask框架来快速搭建这个服务因为它轻巧又简单。3.1 创建Flask应用与接收音频首先我们创建一个基本的Flask应用并设计一个用来上传音频的接口。from flask import Flask, request, jsonify import os import uuid import requests app Flask(__name__) app.config[UPLOAD_FOLDER] ./uploads # 临时存放上传音频的文件夹 os.makedirs(app.config[UPLOAD_FOLDER], exist_okTrue) # 这是你的FUTURE POLICE模型服务地址 AI_MODEL_URL http://your-real-instance-ip:port/v1/audio/analysis app.route(/api/upload_audio, methods[POST]) def handle_audio_upload(): 接收小程序上传的音频文件 if audio not in request.files: return jsonify({error: 没有找到音频文件}), 400 audio_file request.files[audio] user_id request.form.get(user_id, anonymous) # 小程序可以传一个用户标识 if audio_file.filename : return jsonify({error: 文件名为空}), 400 # 生成一个唯一的文件名避免冲突 file_extension os.path.splitext(audio_file.filename)[1] unique_filename f{uuid.uuid4()}{file_extension} save_path os.path.join(app.config[UPLOAD_FOLDER], unique_filename) audio_file.save(save_path) print(f音频文件已保存: {save_path}, 用户: {user_id}) # 接下来调用AI模型 return call_ai_model(save_path, user_id)3.2 调用AI模型并处理结果在上面的函数中保存音频后我们调用了call_ai_model函数。这个函数负责与我们在星图部署的模型“通信”。def call_ai_model(audio_path, user_id): 调用FUTURE POLICE模型服务 try: with open(audio_path, rb) as f: files {audio: f} data {task: asr_and_sentiment, user_id: user_id} # 向AI模型服务发送请求 ai_response requests.post(AI_MODEL_URL, filesfiles, datadata, timeout30) if ai_response.status_code 200: ai_result ai_response.json() transcribed_text ai_result.get(text, ) sentiment ai_result.get(sentiment, neutral) # 这里可以添加将结果保存到数据库的代码见下一节 diary_entry { user_id: user_id, text: transcribed_text, sentiment: sentiment, audio_filename: os.path.basename(audio_path) } save_to_database(diary_entry) # 返回给小程序 return jsonify({ success: True, text: transcribed_text, sentiment: sentiment, message: 日记已保存 }) else: return jsonify({error: AI模型处理失败, detail: ai_response.text}), 500 except requests.exceptions.RequestException as e: return jsonify({error: 连接AI服务失败, detail: str(e)}), 500 except Exception as e: return jsonify({error: 处理过程中发生错误, detail: str(e)}), 500 finally: # 处理完后可以选择删除临时音频文件以节省空间 if os.path.exists(audio_path): os.remove(audio_path)3.3 数据存储使用SQLite记录日记我们需要一个地方来持久化保存用户的日记。为了简单起见我们先使用SQLite数据库它不需要安装额外的服务一个文件就是整个数据库。import sqlite3 from datetime import datetime DB_PATH ./voice_diary.db def init_database(): 初始化数据库创建表只在第一次运行时调用 conn sqlite3.connect(DB_PATH) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS diaries ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT NOT NULL, diary_text TEXT NOT NULL, sentiment TEXT, audio_filename TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) conn.commit() conn.close() def save_to_database(entry): 将日记条目保存到数据库 conn sqlite3.connect(DB_PATH) cursor conn.cursor() cursor.execute( INSERT INTO diaries (user_id, diary_text, sentiment, audio_filename) VALUES (?, ?, ?, ?) , (entry[user_id], entry[text], entry[sentiment], entry[audio_filename])) conn.commit() conn.close() print(f日记已保存到数据库ID: {cursor.lastrowid}) # 在Flask应用启动前初始化数据库 if __name__ __main__: init_database() app.run(host0.0.0.0, port5000, debugTrue)这样一个具备接收音频、调用AI、存储数据能力的后端服务器就搭建好了。你可以先在本地运行它python app.py用上面的测试脚本或者Postman等工具试着上传一个音频文件到http://localhost:5000/api/upload_audio看看整个流程是否通畅。4. 打造界面开发微信小程序前端后端准备好了现在我们来打造用户直接接触的界面——微信小程序。小程序负责录音、上传和展示日记。4.1 小程序页面布局我们创建一个简单的页面包含录音按钮、日记列表和日记详情。在pages/index/index.wxml中view classcontainer !-- 录音区域 -- view classrecord-section wx:if{{!isRecording}} text点击下方按钮开始记录今天的心情/text button typeprimary bindtapstartRecord开始录音/button /view view classrecord-section wx:else text正在录音... 请说话/text button typewarn bindtapstopRecord停止并保存/button /view !-- 录音状态反馈 -- text wx:if{{uploadStatus}}{{uploadStatus}}/text !-- 最新日记预览 -- view classlatest-diary wx:if{{latestDiary.text}} view classsection-title最新日记/view view classdiary-card view classdiary-text{{latestDiary.text}}/view view classdiary-meta text classsentiment {{latestDiary.sentiment}}{{latestDiary.sentimentLabel}}/text text classdate{{latestDiary.date}}/text /view /view /view !-- 历史日记列表 -- view classhistory-section view classsection-title历史记录/view block wx:for{{diaryList}} wx:keyid view classdiary-item bindtapviewDetail>// pages/index/index.js const app getApp() const BASE_URL https://your-backend-server.com // 替换成你部署的后端服务器地址 Page({ data: { isRecording: false, uploadStatus: , latestDiary: {}, diaryList: [], recorderManager: null }, onLoad() { // 获取录音管理器实例 this.setData({ recorderManager: wx.getRecorderManager() }) this.loadDiaryHistory(); }, // 开始录音 startRecord() { this.setData({ isRecording: true, uploadStatus: }); const { recorderManager } this.data; recorderManager.start({ duration: 60000, // 最长60秒 sampleRate: 16000, numberOfChannels: 1, encodeBitRate: 48000, format: mp3 }); }, // 停止录音并上传 stopRecord() { const { recorderManager } this.data; const that this; recorderManager.stop(); recorderManager.onStop((res) { console.log(录音停止临时文件路径, res.tempFilePath); that.setData({ uploadStatus: 正在上传并分析... }); // 上传文件到后端服务器 wx.uploadFile({ url: ${BASE_URL}/api/upload_audio, filePath: res.tempFilePath, name: audio, formData: { user_id: app.globalData.userId || default_user // 假设有一个用户ID }, success(uploadRes) { const data JSON.parse(uploadRes.data); if (data.success) { wx.showToast({ title: 日记保存成功 }); that.setData({ uploadStatus: , isRecording: false, latestDiary: { text: data.text, sentiment: data.sentiment, sentimentLabel: that.getSentimentLabel(data.sentiment), date: new Date().toLocaleDateString() } }); that.loadDiaryHistory(); // 刷新历史列表 } else { wx.showToast({ title: 处理失败 data.error, icon: none }); that.setData({ uploadStatus: 处理失败, isRecording: false }); } }, fail(err) { console.error(上传失败, err); wx.showToast({ title: 网络错误上传失败, icon: none }); that.setData({ uploadStatus: 上传失败, isRecording: false }); } }); }); }, // 从后端加载历史日记 loadDiaryHistory() { wx.request({ url: ${BASE_URL}/api/get_diaries, method: GET, data: { user_id: default_user }, success: (res) { if (res.data.success) { const list res.data.diaries.map(item ({ id: item.id, preview: item.diary_text.substring(0, 30), date: item.created_at.split( )[0] // 只取日期部分 })); this.setData({ diaryList: list }); } } }); }, // 根据情感值返回中文标签 getSentimentLabel(sentiment) { const map { positive: 积极, neutral: 平静, negative: 低落 }; return map[sentiment] || 未知; }, // 查看日记详情 viewDetail(e) { const id e.currentTarget.dataset.id; wx.navigateTo({ url: /pages/detail/detail?id${id} }); } })4.3 后端补充获取日记列表的接口为了让小程序能拉取历史日记我们需要在后端Flask应用中再添加一个简单的接口。app.route(/api/get_diaries, methods[GET]) def get_diaries(): 获取指定用户的历史日记列表 user_id request.args.get(user_id, anonymous) conn sqlite3.connect(DB_PATH) # 使用ROWNUMBER来让查询结果更“听话”这里简化处理 cursor conn.cursor() cursor.execute( SELECT id, diary_text, sentiment, created_at FROM diaries WHERE user_id ? ORDER BY created_at DESC LIMIT 20 , (user_id,)) rows cursor.fetchall() conn.close() diaries [] for row in rows: diaries.append({ id: row[0], diary_text: row[1], sentiment: row[2], created_at: row[3] }) return jsonify({success: True, diaries: diaries})5. 总结跟着上面这些步骤走一遍一个具备完整功能的个人语音日记本原型就诞生了。我们来回顾一下这个过程中你亲手搭建的东西你首先在星图GPU平台上像搭积木一样部署了FUTURE POLICE语音模型它为整个应用提供了“听懂”和“感知情绪”的智能。然后你用Flask搭建了一个轻巧但管用的后端服务器它就像个尽职的邮差在小程序和AI模型之间准确传递信息还把日记稳妥地存进了数据库。最后你开发了一个简洁的微信小程序让用户能够随时随地、用最自然的说话方式记录生活。整个过程涉及了从前端交互、后端逻辑到AI模型调用的全栈开发流程是一个非常好的练手项目。实际使用中你还可以加入更多功能比如给日记添加标签、生成每周情感报告、或者用情感分析的结果推荐一首匹配心情的音乐等等。这个项目的魅力在于它把前沿的AI能力通过常见的开发工具变成了一个触手可及、温暖贴心的个人应用。希望这个实践能给你带来启发也欢迎你在此基础上创造出更独特、更有趣的功能。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
FUTURE POLICE语音模型与微信小程序开发结合:打造个人语音日记本
FUTURE POLICE语音模型与微信小程序开发结合打造个人语音日记本你有没有过这样的时刻一天下来心里积攒了很多话想写下来却又觉得打字太累或者对着空白的文档不知道从何说起。传统的文字日记有时候反而成了一种负担。现在我们可以换一种方式。想象一下你只需要对着手机说说话就像跟朋友聊天一样你的语音不仅能被精准地转换成文字还能被“听懂”背后的情绪——是开心、平静还是有点小烦恼。然后一份带着情感标签的、排版清晰的文字日记就自动生成了。听起来是不是很酷今天我就带你一步步实现这个想法。我们将利用微信小程序作为前端入口在星图GPU平台上部署强大的FUTURE POLICE语音模型作为智能大脑打造一个完全属于你个人的智能语音日记本。整个过程我会用最直白的话讲清楚哪怕你之前没怎么接触过小程序开发或模型部署也能跟着做出来。1. 项目整体思路它到底是怎么工作的在动手写代码之前我们先把这个日记本的工作流程理清楚这样后面每一步你都知道自己在做什么。简单来说这个应用跑通一个完整的“录音-分析-呈现”的闭环你在小程序里说话打开小程序按下录音按钮把今天想说的记录下来。声音传到云端这段录音文件会被安全地上传到我们自己的服务器。AI大脑分析处理服务器收到录音后会调用部署在星图GPU平台上的FUTURE POLICE模型。这个模型干两件核心的事一是把语音转成准确的文字二是分析这段语音里蕴含的情感。结果存起来并返回转写的文字和情感分析结果比如“积极”、“中性”、“消极”会被保存到数据库里同时服务器会整理好这些信息返回给小程序。你看到成型的日记小程序收到数据后就会把文字内容用友好的格式展示出来并且标记上今天的心情状态。你还可以随时回看历史日记。所以我们的开发工作主要分三大块小程序前端、后端服务器和AI模型服务。下面我们就从最核心的AI模型部署开始。2. 核心引擎在星图GPU部署FUTURE POLICE模型我们的日记本聪不聪明全看背后的语音模型。这里我们选择FUTURE POLICE模型因为它通常在语音识别和情感分析上有着不错的综合表现。关键是要把它“安装”到一个能稳定运行且方便我们调用的地方星图GPU平台就很合适。2.1 为什么选择星图GPU平台你可能会问为什么不用自己的电脑原因很简单专业和省心。强大的计算能力语音模型尤其是包含情感分析功能的需要GPU显卡来加速处理。星图平台提供了现成的GPU环境不用你自己买昂贵的显卡。一键式部署平台把很多复杂的环境配置工作都打包好了通过“镜像”的方式让我们能像安装手机APP一样部署模型非常方便。稳定的网络和服务模型需要24小时在线等待小程序调用星图平台能提供稳定的网络和运行环境比自己维护一台电脑做服务器可靠得多。2.2 一步步部署模型这个过程其实比想象中简单我们一步步来。首先你需要登录星图GPU平台。在控制台里找到创建实例或部署服务的入口。关键的一步是选择“镜像”。你可以直接搜索“FUTURE POLICE”或相关的语音处理镜像。平台可能会提供多个版本选择那个标注了“语音识别”、“语音情感分析”或类似功能的、最近更新过的镜像。选好镜像后需要配置一下实例的资源。对于我们的语音日记应用初期用户量不大的话选择一款中等配置的GPU比如平台标注的“性价比型”或“入门GPU型”就完全够用了。接着设置一下实例的名称比如可以叫voice-diary-ai-core。配置完成后点击创建或部署。平台需要几分钟时间来拉取镜像并启动所有服务。当你在控制台看到实例状态变成“运行中”时就成功了一大半。部署成功后平台通常会提供一个访问地址一个URL链接和必要的端口信息。这个URL就是我们小程序的服务器将来要“敲门”的地方。请务必记好这个地址比如http://your-instance-ip:port。2.3 测试模型接口模型服务跑起来之后我们得先确认它能不能正常工作。最直接的方法就是调用它的接口试试。通常这类语音模型会提供一个HTTP API接口。我们可以用一个简单的Python脚本来做测试。你需要准备一个短的、清晰的.wav或.mp3格式的录音文件。import requests # 替换成你从星图平台获取的真实模型服务地址 model_service_url http://your-instance-ip:port/v1/audio/analysis # 准备要发送的音频文件 audio_file_path test_hello.wav with open(audio_file_path, rb) as f: files {audio: f} # 可能还需要一些额外的参数具体看模型API文档 data {task: asr_and_sentiment} response requests.post(model_service_url, filesfiles, datadata) if response.status_code 200: result response.json() print(语音转写结果, result.get(text, N/A)) print(情感分析结果, result.get(sentiment, N/A)) else: print(请求失败状态码, response.status_code) print(错误信息, response.text)运行这个脚本如果能看到返回了你录音的文字内容和情感标签那么恭喜你最核心的AI引擎已经准备就绪随时可以调用。3. 搭建桥梁开发后端服务器现在AI大脑已经在线了但它还不能直接跟微信小程序“对话”。我们需要一个中间人也就是后端服务器来接收小程序的请求转发给AI模型然后再把结果整理好送回小程序。这里我们用Python的Flask框架来快速搭建这个服务因为它轻巧又简单。3.1 创建Flask应用与接收音频首先我们创建一个基本的Flask应用并设计一个用来上传音频的接口。from flask import Flask, request, jsonify import os import uuid import requests app Flask(__name__) app.config[UPLOAD_FOLDER] ./uploads # 临时存放上传音频的文件夹 os.makedirs(app.config[UPLOAD_FOLDER], exist_okTrue) # 这是你的FUTURE POLICE模型服务地址 AI_MODEL_URL http://your-real-instance-ip:port/v1/audio/analysis app.route(/api/upload_audio, methods[POST]) def handle_audio_upload(): 接收小程序上传的音频文件 if audio not in request.files: return jsonify({error: 没有找到音频文件}), 400 audio_file request.files[audio] user_id request.form.get(user_id, anonymous) # 小程序可以传一个用户标识 if audio_file.filename : return jsonify({error: 文件名为空}), 400 # 生成一个唯一的文件名避免冲突 file_extension os.path.splitext(audio_file.filename)[1] unique_filename f{uuid.uuid4()}{file_extension} save_path os.path.join(app.config[UPLOAD_FOLDER], unique_filename) audio_file.save(save_path) print(f音频文件已保存: {save_path}, 用户: {user_id}) # 接下来调用AI模型 return call_ai_model(save_path, user_id)3.2 调用AI模型并处理结果在上面的函数中保存音频后我们调用了call_ai_model函数。这个函数负责与我们在星图部署的模型“通信”。def call_ai_model(audio_path, user_id): 调用FUTURE POLICE模型服务 try: with open(audio_path, rb) as f: files {audio: f} data {task: asr_and_sentiment, user_id: user_id} # 向AI模型服务发送请求 ai_response requests.post(AI_MODEL_URL, filesfiles, datadata, timeout30) if ai_response.status_code 200: ai_result ai_response.json() transcribed_text ai_result.get(text, ) sentiment ai_result.get(sentiment, neutral) # 这里可以添加将结果保存到数据库的代码见下一节 diary_entry { user_id: user_id, text: transcribed_text, sentiment: sentiment, audio_filename: os.path.basename(audio_path) } save_to_database(diary_entry) # 返回给小程序 return jsonify({ success: True, text: transcribed_text, sentiment: sentiment, message: 日记已保存 }) else: return jsonify({error: AI模型处理失败, detail: ai_response.text}), 500 except requests.exceptions.RequestException as e: return jsonify({error: 连接AI服务失败, detail: str(e)}), 500 except Exception as e: return jsonify({error: 处理过程中发生错误, detail: str(e)}), 500 finally: # 处理完后可以选择删除临时音频文件以节省空间 if os.path.exists(audio_path): os.remove(audio_path)3.3 数据存储使用SQLite记录日记我们需要一个地方来持久化保存用户的日记。为了简单起见我们先使用SQLite数据库它不需要安装额外的服务一个文件就是整个数据库。import sqlite3 from datetime import datetime DB_PATH ./voice_diary.db def init_database(): 初始化数据库创建表只在第一次运行时调用 conn sqlite3.connect(DB_PATH) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS diaries ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT NOT NULL, diary_text TEXT NOT NULL, sentiment TEXT, audio_filename TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) conn.commit() conn.close() def save_to_database(entry): 将日记条目保存到数据库 conn sqlite3.connect(DB_PATH) cursor conn.cursor() cursor.execute( INSERT INTO diaries (user_id, diary_text, sentiment, audio_filename) VALUES (?, ?, ?, ?) , (entry[user_id], entry[text], entry[sentiment], entry[audio_filename])) conn.commit() conn.close() print(f日记已保存到数据库ID: {cursor.lastrowid}) # 在Flask应用启动前初始化数据库 if __name__ __main__: init_database() app.run(host0.0.0.0, port5000, debugTrue)这样一个具备接收音频、调用AI、存储数据能力的后端服务器就搭建好了。你可以先在本地运行它python app.py用上面的测试脚本或者Postman等工具试着上传一个音频文件到http://localhost:5000/api/upload_audio看看整个流程是否通畅。4. 打造界面开发微信小程序前端后端准备好了现在我们来打造用户直接接触的界面——微信小程序。小程序负责录音、上传和展示日记。4.1 小程序页面布局我们创建一个简单的页面包含录音按钮、日记列表和日记详情。在pages/index/index.wxml中view classcontainer !-- 录音区域 -- view classrecord-section wx:if{{!isRecording}} text点击下方按钮开始记录今天的心情/text button typeprimary bindtapstartRecord开始录音/button /view view classrecord-section wx:else text正在录音... 请说话/text button typewarn bindtapstopRecord停止并保存/button /view !-- 录音状态反馈 -- text wx:if{{uploadStatus}}{{uploadStatus}}/text !-- 最新日记预览 -- view classlatest-diary wx:if{{latestDiary.text}} view classsection-title最新日记/view view classdiary-card view classdiary-text{{latestDiary.text}}/view view classdiary-meta text classsentiment {{latestDiary.sentiment}}{{latestDiary.sentimentLabel}}/text text classdate{{latestDiary.date}}/text /view /view /view !-- 历史日记列表 -- view classhistory-section view classsection-title历史记录/view block wx:for{{diaryList}} wx:keyid view classdiary-item bindtapviewDetail>// pages/index/index.js const app getApp() const BASE_URL https://your-backend-server.com // 替换成你部署的后端服务器地址 Page({ data: { isRecording: false, uploadStatus: , latestDiary: {}, diaryList: [], recorderManager: null }, onLoad() { // 获取录音管理器实例 this.setData({ recorderManager: wx.getRecorderManager() }) this.loadDiaryHistory(); }, // 开始录音 startRecord() { this.setData({ isRecording: true, uploadStatus: }); const { recorderManager } this.data; recorderManager.start({ duration: 60000, // 最长60秒 sampleRate: 16000, numberOfChannels: 1, encodeBitRate: 48000, format: mp3 }); }, // 停止录音并上传 stopRecord() { const { recorderManager } this.data; const that this; recorderManager.stop(); recorderManager.onStop((res) { console.log(录音停止临时文件路径, res.tempFilePath); that.setData({ uploadStatus: 正在上传并分析... }); // 上传文件到后端服务器 wx.uploadFile({ url: ${BASE_URL}/api/upload_audio, filePath: res.tempFilePath, name: audio, formData: { user_id: app.globalData.userId || default_user // 假设有一个用户ID }, success(uploadRes) { const data JSON.parse(uploadRes.data); if (data.success) { wx.showToast({ title: 日记保存成功 }); that.setData({ uploadStatus: , isRecording: false, latestDiary: { text: data.text, sentiment: data.sentiment, sentimentLabel: that.getSentimentLabel(data.sentiment), date: new Date().toLocaleDateString() } }); that.loadDiaryHistory(); // 刷新历史列表 } else { wx.showToast({ title: 处理失败 data.error, icon: none }); that.setData({ uploadStatus: 处理失败, isRecording: false }); } }, fail(err) { console.error(上传失败, err); wx.showToast({ title: 网络错误上传失败, icon: none }); that.setData({ uploadStatus: 上传失败, isRecording: false }); } }); }); }, // 从后端加载历史日记 loadDiaryHistory() { wx.request({ url: ${BASE_URL}/api/get_diaries, method: GET, data: { user_id: default_user }, success: (res) { if (res.data.success) { const list res.data.diaries.map(item ({ id: item.id, preview: item.diary_text.substring(0, 30), date: item.created_at.split( )[0] // 只取日期部分 })); this.setData({ diaryList: list }); } } }); }, // 根据情感值返回中文标签 getSentimentLabel(sentiment) { const map { positive: 积极, neutral: 平静, negative: 低落 }; return map[sentiment] || 未知; }, // 查看日记详情 viewDetail(e) { const id e.currentTarget.dataset.id; wx.navigateTo({ url: /pages/detail/detail?id${id} }); } })4.3 后端补充获取日记列表的接口为了让小程序能拉取历史日记我们需要在后端Flask应用中再添加一个简单的接口。app.route(/api/get_diaries, methods[GET]) def get_diaries(): 获取指定用户的历史日记列表 user_id request.args.get(user_id, anonymous) conn sqlite3.connect(DB_PATH) # 使用ROWNUMBER来让查询结果更“听话”这里简化处理 cursor conn.cursor() cursor.execute( SELECT id, diary_text, sentiment, created_at FROM diaries WHERE user_id ? ORDER BY created_at DESC LIMIT 20 , (user_id,)) rows cursor.fetchall() conn.close() diaries [] for row in rows: diaries.append({ id: row[0], diary_text: row[1], sentiment: row[2], created_at: row[3] }) return jsonify({success: True, diaries: diaries})5. 总结跟着上面这些步骤走一遍一个具备完整功能的个人语音日记本原型就诞生了。我们来回顾一下这个过程中你亲手搭建的东西你首先在星图GPU平台上像搭积木一样部署了FUTURE POLICE语音模型它为整个应用提供了“听懂”和“感知情绪”的智能。然后你用Flask搭建了一个轻巧但管用的后端服务器它就像个尽职的邮差在小程序和AI模型之间准确传递信息还把日记稳妥地存进了数据库。最后你开发了一个简洁的微信小程序让用户能够随时随地、用最自然的说话方式记录生活。整个过程涉及了从前端交互、后端逻辑到AI模型调用的全栈开发流程是一个非常好的练手项目。实际使用中你还可以加入更多功能比如给日记添加标签、生成每周情感报告、或者用情感分析的结果推荐一首匹配心情的音乐等等。这个项目的魅力在于它把前沿的AI能力通过常见的开发工具变成了一个触手可及、温暖贴心的个人应用。希望这个实践能给你带来启发也欢迎你在此基础上创造出更独特、更有趣的功能。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。