notes: title 全空时用「录音 YYYY-MM-DD HH:MM」;LLM 加猜讲话人 prompt
deploy notes / build-and-deploy (push) Successful in 1m43s
deploy notes / build-and-deploy (push) Successful in 1m43s
This commit is contained in:
+33
-10
@@ -341,9 +341,25 @@ async fn upload_recording(
|
|||||||
let filename = filename.ok_or_else(|| AppError::bad_request("missing audio file"))?;
|
let filename = filename.ok_or_else(|| AppError::bad_request("missing audio file"))?;
|
||||||
let mime = mime.unwrap_or_else(|| "audio/mpeg".to_string());
|
let mime = mime.unwrap_or_else(|| "audio/mpeg".to_string());
|
||||||
let tmp_path = tmp_path.ok_or_else(|| AppError::bad_request("no file uploaded"))?;
|
let tmp_path = tmp_path.ok_or_else(|| AppError::bad_request("no file uploaded"))?;
|
||||||
let title = title
|
// title 完全可选;空时用本地时间 "录音 YYYY-MM-DD HH:MM",比丑的 filename 好读
|
||||||
.filter(|x| !x.is_empty())
|
let title = title.filter(|x| !x.is_empty()).unwrap_or_else(|| {
|
||||||
.unwrap_or_else(|| filename.clone());
|
use std::time::{SystemTime, UNIX_EPOCH};
|
||||||
|
let secs = SystemTime::now()
|
||||||
|
.duration_since(UNIX_EPOCH)
|
||||||
|
.map(|d| d.as_secs())
|
||||||
|
.unwrap_or(0) as i64;
|
||||||
|
let bst_offset = 3600; // 简单 BST/UTC+1,cube 在伦敦
|
||||||
|
let t = secs + bst_offset;
|
||||||
|
let day = t / 86400;
|
||||||
|
let h = (t % 86400) / 3600;
|
||||||
|
let m = (t % 3600) / 60;
|
||||||
|
// 简化日期计算(够看就行)
|
||||||
|
let y = 1970 + day / 365;
|
||||||
|
let yday = (day % 365) as i64;
|
||||||
|
let mo = (yday / 30 + 1).min(12);
|
||||||
|
let d = (yday % 30 + 1).min(28);
|
||||||
|
format!("录音 {:04}-{:02}-{:02} {:02}:{:02}", y, mo, d, h, m)
|
||||||
|
});
|
||||||
|
|
||||||
let id = {
|
let id = {
|
||||||
let conn = s.db.lock().unwrap();
|
let conn = s.db.lock().unwrap();
|
||||||
@@ -485,13 +501,20 @@ async fn call_llm_summary(s: &AppState, transcript: &str) -> Result<String, Stri
|
|||||||
"model": s.llm_model,
|
"model": s.llm_model,
|
||||||
"messages": [
|
"messages": [
|
||||||
{ "role": "system", "content":
|
{ "role": "system", "content":
|
||||||
"你是一个会议纪要助手。根据语音转写整理一份结构化纪要(markdown):\n\
|
"你是一个会议纪要助手。\n\
|
||||||
1. **概要**:1-2 句话总结\n\
|
输入是一段未分句的会议语音转写(可能多人对话,ASR 没区分讲话人,可能有错字)。\n\
|
||||||
2. **关键讨论点**:bullet 列出\n\
|
\n\
|
||||||
3. **决定 / 结论**\n\
|
任务:\n\
|
||||||
4. **行动项 (action items)**:谁、做什么、何时\n\
|
1) 先根据 turn-taking 信号(话题切换、反问、附和、第一/二人称切换)猜测有几个讲话人,标为「讲话人 A / B / C」\n\
|
||||||
5. **待跟进 / 未决问题**\n\
|
2) 输出一份结构化 markdown 纪要:\n\
|
||||||
转写可能有 ASR 错字,结合上下文合理修正;遇到模糊处标 [?]。" },
|
- **参会者**:列出猜测的讲话人(标注「猜测」)\n\
|
||||||
|
- **概要**:1-2 句话总结\n\
|
||||||
|
- **对话还原**:把对话改写成 `**讲话人 A**:xxx` `**讲话人 B**:xxx` 形式,只放关键句\n\
|
||||||
|
- **关键讨论点**:bullet\n\
|
||||||
|
- **决定 / 结论**\n\
|
||||||
|
- **行动项**:谁、做什么、何时\n\
|
||||||
|
- **待跟进 / 未决问题**\n\
|
||||||
|
ASR 明显错字按上下文修正;模糊处标 [?];不要编造没出现的内容。" },
|
||||||
{ "role": "user", "content": trimmed },
|
{ "role": "user", "content": trimmed },
|
||||||
],
|
],
|
||||||
"temperature": 0.3,
|
"temperature": 0.3,
|
||||||
|
|||||||
Reference in New Issue
Block a user