必须用外部ai服务+后端流程编排实现闭环:先ffmpeg转码为pcm wav,再调腾讯云asr或whisper转写,接着用qwen-7b提炼六部分结构化纪要,最后用phpword导出并企微推送。

如果你手头有一段会议录音文件,需要在ThinkPHP项目中自动完成语音转文字、关键信息提取并生成结构化会议纪要,而不是手动复制粘贴或跳转多个工具,那么必须绕过ThinkPHP原生不支持语音识别的限制,用外部AI服务+后端流程编排来实现闭环。这一步不能省:ThinkPHP只负责调度、校验、存储和渲染,真正的语音识别与语义提炼必须交给专业API。
上传录音并预处理为标准格式
前端H5或小程序上传的音频可能是mp3、amr甚至m4a,但阿里云/腾讯云等主流语音API只稳定支持WAV(PCM编码、16kHz、单声道),直接传原始格式会返回“Invalid audio encoding”错误。
使用ffprobe先获取原始时长与编码信息,再调用ffmpeg强制转码:执行命令-ac 1 -ar 16000 -acodec pcm_s16le,缺一不可——漏掉-ac 1会导致多声道识别失败,漏掉-ar 16000会触发采样率不匹配报错。
转码后文件存入public/uploads/audio/,路径记录进数据库audio_records表,字段包括file_path、original_name、duration、user_id、created_at。
调用语音API完成转写
方法一:直连腾讯云ASR API(推荐)
1、在腾讯云控制台开通语音识别服务,获取SecretId与SecretKey,配置到.env中;
2、使用腾讯云官方PHP SDK,构造RecognizeConfig对象,【必须显式设置EngineModelType为16k_zh_cn】,否则默认识别模型对会议口语准确率不足60%;
3、调用AsrClient::Recognize()传入WAV文件流,异步任务需监听回调URL,同步调用则设置ResponseMode为'Offline'以获取完整文本。
方法二:封装OpenAI Whisper-1(需代理穿透)
1、ThinkPHP控制器中构建multipart/form-data请求体,用CURLFile包装WAV文件;
2、Header必须带Authorization: Bearer sk-xxx,且Content-Type不能手动设置,由curl自动填充boundary;
3、响应成功后,从JSON中提取text字段,存入audio_records表的transcript_text字段。
用NLP模型提炼结构化纪要
第一步:清洗转写文本
过滤“嗯”“啊”“这个”“那个”等填充词,删除重复句首(如连续三句都以“我觉得”开头,只保留第一句),合并同一发言人相邻短句——这步不做,后续要点提取会把碎片当独立观点。
第二步:注入提示词触发大模型分析
将清洗后的文本作为上下文,向Qwen-7B本地Ollama服务发送POST请求,指令为:“请严格按以下六部分输出:①会议标题(从首段提取关键词组合);②时间(推断YYYY-MM-DD HH:MM格式);③参会人(识别所有被称呼姓名及自我介绍句式);④议题摘要(每议题≤3句话,禁用‘可能’‘大概’等模糊词);⑤决议事项(每条前加【决策】,必须含动作动词);⑥待办任务(每条前加【待办】,必须含责任人姓名与YYYY-MM-DD截止日)。”
第三步:解析返回的Markdown结构
用PHP的Parsedown库将返回结果转为HTML,再用DOMDocument提取各二级标题(## 标题)下的内容块,映射到meeting_minutes表对应字段:title、date、attendees、agenda_summary、decisions、action_items。
导出并分发纪要文档
1、从meeting_minutes表查出刚生成的记录,用PHPWord库动态创建Word文档;
2、标题设为加粗黑体小二号,参会人名单用项目符号,每个【决策】段落前插入✅图标,每个【待办】段落后换行加灰色底纹标注“责任人:XXX|截止:YYYY-MM-DD”;
3、文件命名为meeting_{$id}_{$date}.docx,保存至storage/app/minutes/;
4、调用企业微信机器人API,向会议组织者所在群发送消息:“已生成纪要《{$title}》,点击下载→[链接]”,链接指向/storage/app/minutes/meeting_{$id}_{$date}.docx的临时可访问URL。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











