H5錄音、圖文視頻IndexDB儲存最佳實踐:用AI生成語音備忘錄

引言

早在大學的時候,我就期望做一款屬于自己的 APP,可惜那時不懂技術。現在有了技術,但卻沒有時間。好在 AI 的快速發展終于讓我完成了這個愿望。于是,我用半天的時間,用 AI 生成了一個純前端的 H5 程序:隨心記

在線體驗地址:https://aicoding.juejin.cn/aicoding/work/7519454663779811366

什么是隨心記

隨心記是一個由 AI 生成的網頁備忘錄,它支持語音錄入(可下載)、圖文視頻記錄。最重要的是,它支持離線使用,所有數據都儲存在瀏覽器中,不依賴后端,刷新頁面數據也不會丟失!

此外,它還做了語音兼容處理,支持在 iOS 和安卓設備中通過 WebView 嵌套使用。

功能介紹

  • 歡迎頁

  • 信息錄入頁

支持圖文

支持語音錄入、播放、下載

數據離線緩存,刷新頁面不丟失

僅點擊退出會清空數據

技術棧

本項目通過Trae+Claude-3.7生成,純科技,不夾雜人工代碼,項目最終通過掘金MCP一鍵部署發布。

作品發布&體驗地址:https://aicoding.juejin.cn/aicoding/work/7519454663779811366

AI的代碼技術棧如下:

  • 星空背景:Cnavas實現
  • 錄音功能:純原生實現,后為了兼容改用record-core
  • 圖片/視頻功能:Vant-UI
  • 數據離線儲存:采用IndexDB

AI實踐過程

開發工具準備

要使用AI實現這樣一個小程序,首先要選取合適的AI編程工具。比如字節的Trae或國外的Cursor都行,由于要使用掘金的MCP一鍵部署,還是建議使用Trae

不同的AI模型可能影響代碼生成效果,因此,建議使用Claude,編碼能力更強。

產品及prompt設計

要使用 AI 生成你想要的項目,首先一定要設計好你的產品,比如它包含哪些模塊,有哪些功能,交互邏輯如何等等。因為這些內容,最終都將作為 prompt(AI模型提示詞) 投喂給 AI,而 prompt 的詳細程度,往往直接決定了你生成的產品質量。

當然,如果你實在不知道怎么設計產品,也可以請教 ChatGPT,比如這樣問:

我想通過AI編譯器生成一個記事本APP,幫我設計一個詳細的prompt

設置自定義智能體

為了讓AI開發代碼更準確,符合我們的開發、編碼習慣,我們可以創建一個智能體,讓AI通過我們的預設信息來進行代碼生成。

通過AI提問開發項目

一切都準備好后,我們就可以使用AI生成項目了。首先,我們需要讓AI幫我們搭建項目框架。

我要創建一個名為“隨心記”的APP,使用Vue3+typeScript+less幫我搭建項目框架,不要寫入任何內容,等待我的指示

搭建項目的過程中,我們只需要按照提示,運行相應的命令即可:

項目搭建好,我們就可以按照模塊,讓AI幫我們一步步完善代碼。我們以生成星空背景+手機框架為例。

promot:幫我生成星空背景,樣式要炫酷,屏幕中間顯示一個Ihone的手機框架。

我們可以用過上下文協議,選中某個文件,將代碼生成在指定位置:

代碼生成后,我們先預覽效果,如果效果不達標,我們可以通過不斷提問去增加細節,如給背景的星星增加閃爍效果,給背景增加流星之類的。通過不斷優化promot,效果會越來越接近我們想要的效果。

給出我通過AI生成的星空背景代碼:

<template><div class="media-wrap"><canvas class="star-canvas"></canvas></div></template><script setup>import { onMounted } from 'vue'
onMounted(() => {const canvas = document.querySelector('.star-canvas')const ctx = canvas.getContext('2d')function resize() {canvas.width = canvas.offsetWidthcanvas.height = canvas.offsetHeight}resize()window.addEventListener('resize', resize)// ? 星星類(星星變大)class Star {constructor() {this.reset()}reset() {this.x = Math.random() * canvas.widththis.y = Math.random() * canvas.heightthis.radius = Math.random() * 2.5 + 0.5  // ? 更大:0.5 ~ 3pxthis.alpha = Math.random()this.fade = Math.random() * 0.02this.speed = 0.1 + Math.random() * 0.3}update() {this.y += this.speedthis.alpha += this.fadeif (this.alpha <= 0 || this.alpha >= 1) this.fade = -this.fadeif (this.y > canvas.height) this.reset()}draw() {ctx.beginPath()ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2)ctx.fillStyle = `rgba(255,255,255,${this.alpha})`ctx.fill()}}// ?? 流星類(左下 → 右上)class Meteor {constructor() {this.reset()}reset() {this.x = Math.random() * canvas.width * 0.5         // 左側this.y = canvas.height - Math.random() * canvas.height * 0.5  // 下方this.len = Math.random() * 80 + 100this.speed = Math.random() * 4 + 6this.angle = Math.PI / 4  // ↗ 從左下到右上this.alpha = 1}update() {this.x += this.speed * Math.cos(this.angle)this.y -= this.speed * Math.sin(this.angle)this.alpha -= 0.01if (this.alpha <= 0) this.reset()}draw() {const x = this.xconst y = this.yconst len = this.lenctx.save()ctx.beginPath()ctx.moveTo(x, y)ctx.lineTo(x + len * Math.cos(this.angle),y - len * Math.sin(this.angle))ctx.strokeStyle = `rgba(255,255,255,${this.alpha})`ctx.lineWidth = 2ctx.shadowColor = '#fff'ctx.shadowBlur = 10ctx.stroke()ctx.restore()}}const stars = Array.from({ length: 200 }, () => new Star())const meteors = Array.from({ length: 3 }, () => new Meteor())function animate() {ctx.clearRect(0, 0, canvas.width, canvas.height)stars.forEach(star => {star.update()star.draw()})meteors.forEach(meteor => {meteor.update()meteor.draw()})requestAnimationFrame(animate)}animate()
})
</script><style lang="less" scoped>
.media-wrap {width: 100%;height: 100vh;overflow: hidden;background: linear-gradient(to bottom, #1b1e3f, #2c3e50, #3b2c59); // 深藍+紫色// ? 動態漸變星云背景background: linear-gradient(-45deg, #1b1e3f, #2c3e50, #3b2c59, #1b1e3f);background-size: 400% 400%;animation: galaxyMove 20s ease infinite;.star-canvas {position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 0;}.iphone {width: 380px;height: 85%;border-radius: 30px;position: relative;box-shadow: 0 0 0 10px black;margin: 40px auto;z-index: 1;.screen {width: 100%;height: 100%;border-radius: 30px;margin-top: 5%;overflow: hidden;}.notch {position: absolute;top: 0;left: 50%;transform: translateX(-50%);width: 130px;height: 30px;background: #000;border-bottom-left-radius: 20px;border-bottom-right-radius: 20px;z-index: 2000;}.side-button {position: absolute;width: 4px;background: #666;border-radius: 2px;&.power {height: 40px;right: -6px;top: 120px;}&.volume-up {height: 30px;left: -6px;top: 100px;}&.volume-down {height: 30px;left: -6px;top: 140px;}}}
}.title {position: relative;z-index: 2;text-align: left;margin-top: 20px;font-weight: 600;letter-spacing: 1px;text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);.gradient-text {font-size: 28px;background: linear-gradient(45deg, #f9d423, #ff4e50, #7b4397, #00c6ff);background-size: 300% 300%;-webkit-background-clip: text;-webkit-text-fill-color: transparent;animation: gradient-shift 8s ease infinite, pulse 2s infinite alternate;}
}.info {color: #fff;position: fixed;bottom: 10px;right: 10px;cursor: pointer;font-size: 16px;
}@keyframes galaxyMove {0% {background-position: 0% 50%;}50% {background-position: 100% 50%;}100% {background-position: 0% 50%;}
}@keyframes gradient-shift {0% {background-position: 0% 50%;}50% {background-position: 100% 50%;}100% {background-position: 0% 50%;}
}@keyframes pulse {0% {transform: scale(1);}100% {transform: scale(1.05);}
}
</style>

在我用AI 生成的這個項目中,最復雜的部分莫過于錄音功能了,通過大約半小時的反復提問與細節優化,終于通過代碼實現了語音錄入、自定義語音樣式、語音播放的功能。

AI的核心實現原理是通過原生錄音事件完成的

// 創建音頻上下文
const AudioContext = window.AudioContext || (window as any).webkitAudioContext
audioContext = new AudioContext()// 創建分析器
analyser = audioContext.createAnalyser()
analyser.fftSize = 256 // 必須是2的冪次方
const bufferLength = analyser.frequencyBinCount // 通常是fftSize的一半
dataArray = new Uint8Array(bufferLength)// ...// 請求錄音權限
navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {resolve(stream)}).catch((err) => {console.error('獲取錄音權限失敗:', err)Toast('獲取錄音權限失敗,請檢查權限設置')reject(err)})// 創建MediaRecorder實例
recorder = new MediaRecorder(stream as MediaStream)

但經過實際測試,在IOS的webview中,這種方案兼容性不好,在低版本的IOS中,錄音播放異常,這與原生錄音方法生成的錄音格式有關。

于是,通過搜索,最終使用了record-core實現了錄音功能,并讓AI幫我重構了代碼。

對于數據的離線儲存,通過提問AI后,選用了indexDB的儲存方案。但在實測中,播放語音時會報錯:

于是,通過提問AI繼續修復與優化。

在經過不斷地測試與AI修復后,功能終于是沒有任何問題了。在整體項目生成后,就是利用AI提問不斷完善一些小功能

用AI生成項目的過程需要一步步的提問,讓AI優化細節,這個過程其實是比較漫長的,但對于不懂技術或者不想自己寫代碼的同學而言,這都不是什么問題。

項目開發完畢,就可以部署在線上體驗了。

項目部署

要發布線上,目前最方便的方式就是在Trae中配置MCP,一鍵部署。

部署前,我們需要先配置掘金的MCP,在 Trae 或 IDE 的 MCP 配置中,添加以下 JSON 配置:

{"mcpServers": {"juejin-deploy-mcp": {"command": "npx","args": ["--registry=https://registry.npmjs.org","-y","@juejin-team/mcp-server@latest"],"env": {"JUEJIN_TOKEN": ""}}}
}

注意,配置項中的JUEJIN_TOKEN需要填寫你自己的掘金Token,獲取地址如下:

https://www.zhihu.com/

點擊添加后,你就可以在你的內置智能體中看到到

現在,你只需要切換到這個智能體,給出對應的部署提示即可。

部署成功后,會在對話框看到部署鏈接,點擊后就可以看到效果。

總結

通過本文可以看出,借助 AI 從零開發一個完整的程序已不再是夢想,這讓越來越多的人有機會成為創作者。而要用好 AI 開發產品,提示詞(prompt)的質量至關重要。令人驚喜的是,優秀的提示詞本身也可以由 AI 生成。用 AI 生成 prompt,再用這個 prompt 指導 AI 開發產品,這種“AI 調用 AI”的方式,既魔幻又充滿趣味。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡述C++ nlohmann/json 庫

目錄 JSON概述 nlohmann/json 庫的使用 創建json數組/對象 字符串解析&#xff08;parse反序列化&#xff09; 數據訪問 序列化 文件讀寫 JSON概述 JSON(JavaScrip Object Notation)是一種輕量級、跨語言的數據交換格式。它基于 ECMAScript 子集&#xff0c;以獨立于編程…

定制開發開源AI智能名片與S2B2C商城小程序的內容分發體系構建:基于“1+N“素材復用模型的創新實踐

摘要&#xff1a;在數字內容爆炸式增長的當下&#xff0c;本文針對內容分發效率低下的行業痛點&#xff0c;提出基于"定制開發開源AI智能名片S2B2C商城小程序"的一體化解決方案。通過構建"1篇長文10條長視頻20條短視頻10個平臺"的素材復用公式&#xff0c;…

c++26新功能—hive容器

一、容器的演進 科學進步的過程一般來說都是從先解決常用的、迫切的問題開始&#xff0c;然后再逐步解決一些少見不迫切的問題&#xff0c;直到最終解決到認知程度內的諸多問題。舉一個網上的例子&#xff0c;以前說咱們無法生產水筆的尖頭上的鋼球&#xff0c;其實這對于國內…

Kafka 源碼剖析:消息存儲與協議實現(二)

四、協議實現機制探秘 4.1 生產者協議 4.1.1 消息發送流程 Producer 在向 Kafka 集群發送消息時&#xff0c;首先會根據分區策略選擇目標分區 。常見的分區策略有輪詢、按消息鍵的哈希值分區以及自定義分區策略 。如果生產者在發送消息時指定了分區號&#xff0c;那么消息就…

Vue.js 與 TypeScript:最佳實踐

1. 引言 Vue.js 是一個漸進式、靈活的 JavaScript 框架&#xff0c;廣泛用于構建用戶界面和單頁應用&#xff08;SPA&#xff09;。而 TypeScript 是 JavaScript 的一個超集&#xff0c;添加了靜態類型和其他高級特性。將兩者結合使用&#xff0c;可以幫助開發者構建更具可維護…

webpack5 css-loader:從基礎到原理

webpack 處理樣式 webpack本身是不能識別樣式資源的&#xff0c;需要借助Loader來幫助webpack解析樣式資源&#xff0c;樣式資源包括但不限于css/less/sass/scss/styl 未使用樣式處理加載器前 運行webpack打包命令 bash npx webpack報錯信息如圖&#xff0c;提示無法識別css…

【GESP】C++三級練習 luogu-B2096 直方圖

GESP C三級練習&#xff0c;一維數組練習&#xff0c;難度★★☆☆☆。 題目題解詳見&#xff1a;【GESP】C三級練習 luogu-B2096 直方圖 | https://www.coderli.com/gesp-3-luogu-b2096/ 【GESP】C三級練習 luogu-B2096 直方圖 | OneCoderGESP C三級練習&#xff0c;一維數組…

【網站內容安全檢測】之2:從網站所有URL頁面中提取所有外部及內部域名信息

還沒寫成Go的&#xff0c;用Python吧&#xff0c;稍微慢一點 依賴內容&#xff08;安裝命令pip install -r requirements.txt) requirements.txt aiohttp beautifulsoup44.12.2 tqdm4.66.1 redis5.2.1 motor3.3.1 pymongo4.6.0 chardet提取域名的程序 domain_extractor.py …

【LLaMA-Factory 實戰系列】四、API 篇 - 部署推理服務與批量調用實戰

【LLaMA-Factory 實戰系列】四、API 篇 - 部署推理服務與批量調用實戰 1. 引言2. 推理后端的選擇與對比3. 部署 API 推理服務3.1 創建 API 配置文件3.2 啟動 API 服務3.3 探索交互式 API 文檔 4. 編寫 Python 腳本進行批量調用4.1 準備工作4.2 批量調用腳本4.3 運行腳本并查看結…

C++工廠模式的作用(工廠方法、Factory Method、Factory Pattern)

文章目錄 代碼示例工廠的作用1. 對象創建的封裝 &#x1f3ed;2. 解耦客戶端和具體類 &#x1f517;3. 統一的創建入口 &#x1f6aa;4. 隱藏實現細節 &#x1f3ad; 在這個項目中的具體體現總結 代碼示例 https://gitee.com/arnold_s/my-learning-test/tree/master/20250610_…

9-C#修改任務管理的名稱

C#修改任務管理的名稱

Fisco Bcos學習 - 搭建第一個區塊鏈網絡

文章目錄 一、前言二、環境準備三、安裝依賴在 macOS 上安裝依賴在 Ubuntu 上安裝依賴在 CentOS 上安裝依賴 四、創建操作目錄并下載安裝腳本五、搭建單群組 4 節點聯盟鏈六、啟動 FISCO BCOS 鏈七、檢查進程八、檢查日志輸出 在數字化時代&#xff0c;區塊鏈技術正逐漸成為推動…

可視化圖解算法53:表達式求值

牛客網 面試筆試 TOP 101 1. 題目 描述 請寫一個整數計算器&#xff0c;支持加減乘三種運算和括號。 數據范圍&#xff1a;0≤∣s∣≤100&#xff0c;保證計算結果始終在整型范圍內 要求&#xff1a;空間復雜度&#xff1a; O(n)&#xff0c;時間復雜度 O(n) 示例1 輸入…

小白成長之路-Nginx配置(二)

文章目錄 一、localtion配置1.匹配規則2.匹配優先級3.配置案例 二、rewrite1、 語法2、 可寫入字段3 配置案例4 if 指令5.sutoindex6. nginx配置中的常用變量 三、配置Nginx狀態統計1.下載vts模塊2.編譯nginx 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參…

Qt的第一個程序

Qt的第一個程序 1.hello world2.使用圖形化拖拽方式3.使用C代碼的方式3.1.頭文件3.2.setText3.3.對象樹 4.設計MyLabel5.亂碼問題 &#x1f31f;&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xff…

圖書數據接口

基本說明&#xff1a; 接口地址&#xff1a;http://data.isbn.work/openApi/getInfoByIsbn?isbn{isbn}&appKey{appkey}返回格式&#xff1a;json請求方式&#xff1a;get請求示例&#xff1a;http://data.isbn.work/openApi/getInfoByIsbn?isbn9787513159074&appKey…

MongoDB原理

目錄 一、概念 二、架構 2.1 邏輯結構 2.2 數據模型 2.3 存儲引擎&#xff1a;WiredTiger 三、事務 一、概念 MongoDB是文檔數據庫&#xff0c;基本存儲單元是 文檔&#xff08;Document&#xff09;&#xff0c;以BSON格式&#xff08;一種類json的二進制形式&#xff…

《解碼音頻:從基礎到未來的聽覺探索》

音頻&#xff1a;開啟聲音世界的大門 在生活的每一個角落&#xff0c;音頻如影隨形&#xff0c;編織出豐富多彩的聽覺體驗。清晨&#xff0c;第一縷陽光尚未完全照進房間&#xff0c;手機里溫柔的鬧鐘鈴聲&#xff0c;將我們從睡夢中輕輕喚醒&#xff0c;開啟活力滿滿的一天。通…

web安全之h2注入系統學習

起初是在N1 Junior 2025 上面碰到一題&#xff0c;考點是h2的sql注入。由于之前沒有見過&#xff0c;趁此機會系統學習一番 實驗代碼 public class H2Inject {public static void main(String[] args) throws Exception{JdbcDataSource dataSource new JdbcDataSource();dataS…

AWS認證系列:考點解析 - cloud trail,cloud watch,aws config

&#x1f3af;一句話總覽&#xff1a; 服務名類比/角色主要功能CloudTrail監控攝像頭錄像回放記錄“誰在什么時候做了什么操作”CloudWatch護士測體溫 護士喊醫生實時監控系統狀態&#xff0c;并能報警/自動應對AWS Config保安巡邏 記錄資產變更歷史記錄 AWS 資源的“配置狀…