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

📅 2026/6/16 2:19:58
语音识别 + TTS:搭建一个语音笔记助手
我有一个习惯——通勤路上用手机录音记想法。录了三个月积压了 80 多条没整理。3 月的某个周末我花半天写了一个工具语音 → 转文字 → LLM 整理 → 念给我听。现在每天下班路上录完到家时手机上已经有一份整理好的笔记了。这篇文章把这个工具的完整 Go 代码给你。复制下来就能跑。整体流程手机录音.m4a / .mp3 → ffmpeg 转格式 → Whisper API 语音转文字 → DeepSeek 整理成结构化笔记 → Edge TTS 转语音可选路上听 → 保存到本地 Markdown三块核心功能语音识别 LLM 整理 语音合成。每一步都有 Go 代码。第一步语音转文字 —— 调 Whisper APIOpenAI 的 Whisper API 是中文语音识别准确率最高的服务之一。当然你也可以用本地 Whisper 模型但 API 省显卡packagemainimport(bytesencoding/jsonfmtiomime/multipartnet/httposos/execpath/filepathstrings)funcconvertToMp3(inputPathstring)(string,error){outputPath:strings.TrimSuffix(inputPath,filepath.Ext(inputPath)).mp3cmd: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提交里没有写清楚这个需求对应的是哪个TaskWhisper 输出今天想到一个点子 就是可以把那个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 #标签2returncallLLM(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(ionet/httposstrings)// Edge TTS 免费不需要 API KeyfunctextToSpeech(text,outputPathstring)error{// Edge TTS 的 SSML 格式请求ssml:fmt.Sprintf(speak version1.0 xmlnshttp://www.w3.org/2001/10/synthesis xmlns:msttshttps://www.w3.org/2001/mstts xml:langzh-CN voice namezh-CN-XiaoxiaoNeural prosody rate0.9 pitch0%% %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).mp3fmt.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.0005TTSEdge TTS免费合计约 ¥0.04 / 条录一条 1 分钟的语音整理成笔记念给你听——总成本 4 分钱。还能怎么扩展这个基础骨架搭好后往哪个方向扩展都可以基础版本文 → 本地文件输入Markdown 输出 扩展 1 → 加上微信机器人发语音自动转笔记 扩展 2 → 多说话人识别会议录音自动做纪要 扩展 3 → 笔记存入向量数据库语义搜索 扩展 4 → 定时扫描邮箱/IM发现语音附件自动处理其实这个工具的骨架跟 daily-report-agent 是一样的——数据源 AI 处理 结果输出。只是数据源从 Git API 换成了音频文件。下一篇让 AI 看视频。