news 2026/6/16 2:19:56

语音识别 + TTS:搭建一个语音笔记助手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
语音识别 + TTS:搭建一个语音笔记助手

我有一个习惯——通勤路上用手机录音记想法。录了三个月,积压了 80 多条没整理。

3 月的某个周末我花半天写了一个工具:语音 → 转文字 → LLM 整理 → 念给我听。现在每天下班路上录完,到家时手机上已经有一份整理好的笔记了。

这篇文章把这个工具的完整 Go 代码给你。复制下来就能跑。


整体流程

手机录音(.m4a / .mp3) → ffmpeg 转格式 → Whisper API 语音转文字 → DeepSeek 整理成结构化笔记 → Edge TTS 转语音(可选,路上听) → 保存到本地 Markdown

三块核心功能:语音识别 + LLM 整理 + 语音合成。每一步都有 Go 代码。


第一步:语音转文字 —— 调 Whisper API

OpenAI 的 Whisper API 是中文语音识别准确率最高的服务之一。当然你也可以用本地 Whisper 模型,但 API 省显卡:

packagemainimport("bytes""encoding/json""fmt""io""mime/multipart""net/http""os""os/exec""path/filepath""strings")funcconvertToMp3(inputPathstring)(string,error){outputPath:=strings.TrimSuffix(inputPath,filepath.Ext(inputPath))+".mp3"cmd:=exec.Command("ffmpeg","-i",inputPath,"-acodec","libmp3lame","-ar","16000","-ac","1","-y",outputPath,)iferr:=cmd.Run();err!=nil{return"",fmt.Errorf("ffmpeg 转换失败: %w",err)}returnoutputPath,nil}functranscribeAudio(audioPathstring)(string,error){apiKey:=os.Getenv("OPENAI_API_KEY")// 构建 multipart 请求varbuf bytes.Buffer w:=multipart.NewWriter(&buf)// 添加文件file,_:=os.Open(audioPath)deferfile.Close()part,_:=w.CreateFormFile("file",filepath.Base(audioPath))io.Copy(part,file)// 添加参数w.WriteField("model","whisper-1")w.WriteField("language","zh")// 中文w.WriteField("response_format","text")w.Close()req,_:=http.NewRequest("POST","https://api.openai.com/v1/audio/transcriptions",&buf,)req.Header.Set("Authorization","Bearer "+apiKey)req.Header.Set("Content-Type",w.FormDataContentType())resp,err:=http.DefaultClient.Do(req)iferr!=nil{return"",err}deferresp.Body.Close()text,_:=io.ReadAll(resp.Body)returnstring(text),nil}

实测效果——我录了一段 45 秒的中文口述:

输入(录音):

"今天想到一个点子,就是可以把那个daily report agent 扩展一下,让它不只是读Git提交,还能读Jira的工单状态 ...不对不对,应该是先读Jira再读Git,因为有的时候 Git提交里没有写清楚这个需求对应的是哪个Task"

Whisper 输出:

今天想到一个点子 就是可以把那个daily report agent 扩展一下 让它不只是读Git提交 还能读Jira的工单状态 不对不对 应该是先读Jira再读Git 因为有的时候Git提交里 没有写清楚这个需求对应的是哪个Task

口语化的「不对不对」、停顿、犹豫词全保留了——这就是原始转录。还需要 LLM 整理。


第二步:LLM 整理成结构化笔记

原始转录太碎,不能直接用。丢给 DeepSeek 整理:

funcorganizeNote(transcriptstring)(string,error){systemPrompt:=`你是笔记整理助手。将口语化的语音转录整理成结构化笔记。 规则: 1. 去掉口语冗余词("那个""就是说""不对不对"等) 2. 修正因语音识别导致的错别字 3. 保持原意,不要添加转录中没有的内容 4. 用 Markdown 格式输出 格式: ## [一句话标题] **核心想法:** (1-2 句总结) **详细内容:** (整理后的完整内容) **待办/下一步:** (如果有明确的下一步,列出来;没有就写"暂无") **标签:** #标签1 #标签2`returncallLLM(systemPrompt,transcript)}

实际跑出来的结果:

## daily-report-agent 集成 Jira 工单 **核心想法:** daily-report-agent 应扩展数据源,先读 Jira 工单再读 Git 提交, 实现需求到代码的完整追溯。 **详细内容:** 现有 daily-report-agent 仅支持 Git 提交记录。建议扩展为: 1. 先查询 Jira 中当前用户的活跃工单 2. 根据工单关联的分支/PR 拉取对应的 Git 提交 3. 生成"需求 → 开发 → 提交"完整链路的工作汇报 **待办/下一步:** - 调研 Jira REST API(/rest/api/2/search) - 确认 CNB 的 Jira 集成方式 - 估算开发工时 **标签:** #daily-report-agent #Jira #工作流优化

口语碎碎念变成了结构化笔记。这才是我记完能用的东西。


第三步:TTS —— 让 AI 念给你听

有时候不想看屏幕,想在路上听。Edge TTS 是微软的免费服务,中文语音质量非常好:

import("io""net/http""os""strings")// Edge TTS 免费,不需要 API KeyfunctextToSpeech(text,outputPathstring)error{// Edge TTS 的 SSML 格式请求ssml:=fmt.Sprintf(`<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-CN"> <voice name="zh-CN-XiaoxiaoNeural"> <prosody rate="0.9" pitch="0%%"> %s </prosody> </voice> </speak>`,text)// 调 Edge TTS 的 WebSocket 接口比较复杂,这里展示 HTTP 接口简化版// 实际推荐使用 github.com/xxx/edge-tts-go 封装好的库req,_:=http.NewRequest("POST","https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list",nil,)// ... Edge TTS 的具体调用(完整代码见 GitHub 仓库)_=reqreturnnil}

Edge TTS 完整客户端代码较长(含 WebSocket 连接、SSML 构建),完整版在 GitHub - lobster-bujiaban/voice-note


组装:一个 main 函数串起全流程

funcmain(){iflen(os.Args)<2{fmt.Println("用法: voice-note <音频文件>")fmt.Println("支持格式: m4a, mp3, wav, ogg")os.Exit(1)}audioFile:=os.Args[1]fmt.Println("🎤 处理音频:",audioFile)// 1. 格式转换fmt.Print(" → 转换格式...")mp3File,err:=convertToMp3(audioFile)iferr!=nil{fmt.Printf("失败: %v\n",err)os.Exit(1)}fmt.Println(" 完成")// 2. 语音转文字fmt.Print(" → 语音转文字...")transcript,err:=transcribeAudio(mp3File)iferr!=nil{fmt.Printf("失败: %v\n",err)os.Exit(1)}fmt.Printf(" 完成 (%d 字)\n",len([]rune(transcript)))// 3. LLM 整理fmt.Print(" → LLM 整理...")note,err:=organizeNote(transcript)iferr!=nil{fmt.Printf("失败: %v\n",err)os.Exit(1)}fmt.Println(" 完成")// 4. 保存 Markdownfilename:=fmt.Sprintf("note-%s.md",time.Now().Format("2006-01-02-150405"))os.WriteFile(filename,[]byte(note),0644)fmt.Println(" → 已保存:",filename)// 5. 生成语音(可选)audioOutput:=strings.TrimSuffix(filename,".md")+".mp3"fmt.Print(" → 生成语音...")iferr:=textToSpeech(note,audioOutput);err!=nil{fmt.Printf("跳过: %v\n",err)}else{fmt.Println(" 完成:",audioOutput)}fmt.Println("\n✅ 完成!你的笔记:")fmt.Println(note)}

成本

步骤服务成本
语音转文字Whisper API$0.006/分钟 ≈ ¥0.04
整理DeepSeek V4 Flash约 500 token ≈ ¥0.0005
TTSEdge TTS免费
合计约 ¥0.04 / 条

录一条 1 分钟的语音,整理成笔记,念给你听——总成本 4 分钱。


还能怎么扩展

这个基础骨架搭好后,往哪个方向扩展都可以:

基础版(本文) → 本地文件输入,Markdown 输出 扩展 1 → 加上微信机器人,发语音自动转笔记 扩展 2 → 多说话人识别,会议录音自动做纪要 扩展 3 → 笔记存入向量数据库,语义搜索 扩展 4 → 定时扫描邮箱/IM,发现语音附件自动处理

其实这个工具的骨架跟 daily-report-agent 是一样的——数据源 + AI 处理 + 结果输出。只是数据源从 Git API 换成了音频文件。

下一篇:让 AI 看视频。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 2:18:54

当机器开始养育机器——嵌入式视角下的未来社会沙盘推演

从“AI替代职业”的当下&#xff0c;到“机器人制造机器人”的未来&#xff0c;一个全新物种的雏形正在数字世界中孵化&#xff0c;而它的成长轨迹&#xff0c;将重新定义财富、权力与人的意义。最近&#xff0c;我与AI进行了一场漫长的对话。聊到最后&#xff0c;一个清晰的图…

作者头像 李华
网站建设 2026/6/16 2:15:50

5分钟构建专业级ACES色彩管理:OpenColorIO配置完全指南

5分钟构建专业级ACES色彩管理&#xff1a;OpenColorIO配置完全指南 【免费下载链接】OpenColorIO-Config-ACES 项目地址: https://gitcode.com/gh_mirrors/op/OpenColorIO-Config-ACES OpenColorIO配置为ACES是一款革命性的开源工具&#xff0c;专门为影视、动画和视觉…

作者头像 李华
网站建设 2026/6/16 2:14:51

100、构建你的 AI 辅助工程化体系:从工具选择到工作流设计的终极指南

100、构建你的 AI 辅助工程化体系:从工具选择到工作流设计的终极指南 上周五凌晨两点,我盯着终端里那段诡异的段错误日志,Claude Code 已经帮我重写了三版代码,但问题依旧。我习惯性地敲下 claude -p "分析这个core dump",它沉默了三秒,然后抛出一行注释:“兄…

作者头像 李华
网站建设 2026/6/16 2:12:56

算法复杂度的可视化评估与优化策略研究的技术8

引言研究背景与意义算法复杂度在计算机科学中的核心地位可视化评估方法的必要性研究目标与创新点算法复杂度基础理论时间复杂度和空间复杂度的定义渐进符号&#xff08;O, Ω, Θ&#xff09;及其应用场景常见算法复杂度分类&#xff08;线性、对数、多项式、指数等&#xff09…

作者头像 李华
网站建设 2026/6/16 2:10:56

Bilibili-Evolved性能优化指南:3步实现60fps流畅播放体验

Bilibili-Evolved性能优化指南&#xff1a;3步实现60fps流畅播放体验 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved Bilibili-Evolved是一款强大的哔哩哔哩增强脚本&#xff0c;通过模块化组…

作者头像 李华
网站建设 2026/6/16 2:10:54

Windows内存管家Mem Reduct:轻量级实时清理工具完整使用指南

Windows内存管家Mem Reduct&#xff1a;轻量级实时清理工具完整使用指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …

作者头像 李华