---
name: vipthink-crm-recording
description: "豌豆思维CRM录音分析技能。从CRM调取通话录音,通过ASR转文字+AI质检,生成话术评分、客户意向、改进建议等报告。当用户提到以下任何内容时立即使用:CRM录音、录音分析、通话质检、销售录音、话术分析、CC复盘、团队录音、录音转文字、ASR转录、质检评分、豌豆思维、vipthink、语义分析、意图分析、录音报告、录音排名、优秀录音、差录音、录音培训、录音标杆、录音改进、录音总结、录音评价、录音数据、通话数据、有效通话、录音时长、拨通时长、CC表现、渠道分析、客户意向、对话质量、听听录音、看看通话、录音调取、录音下载、录音抽查、批量分析、录音URL、客服录音、电销录音、外呼录音、家长录音、试听录音、签约录音、跟进录音、回访录音。"
本技能封装了从VIPThink CRM系统调取电话录音并进行智能分析的完整操作流程,包括:
当本skill被触发时,必须先向用户确认以下信息后再执行任何CRM或API操作:
n - 港澳团队(默认)n - 北京上海团队`n - 台湾团队用户确认后,根据选择拼接CRM URL并开始执行。
| 工具 | 用途 |
|---|---|
| ------ | ------ |
| browser_evaluate | 执行JavaScript,操作Vue动态渲染内容 |
| browser_snapshot | 获取页面快照,定位元素 |
| browser_wait_for | 等待页面加载/弹窗出现 |
| browser_tabs | 管理浏览器标签页 |
| 服务 | 用途 | 详情 |
|---|---|---|
| ------ | ------ | ------ |
| 阿里云DashScope ASR | 语音转录 | Paraformer-v2模型,支持粤语+普通话,说话人分离 |
| 阿里云DashScope LLM | 质检分析 | Qwen-Plus模型,结构化JSON输出 |
| 团队 | admin_group_list | `n | ------ | ----------------- | `n | 港澳团队 | 8,70,172 | `n | 北京上海团队 | 8,70,154 | `n | 台湾团队 | 8,70,180 |
|---|
| 显示名称 | URL值 |
|---|---|
| --------- | ------- |
| 全部 | all |
| 今日新分配 | today_new |
| 今日需回访 | today_callback |
| 未约课 | no_lesson |
| 今日上课 | today_lesson |
| 今日完课 | today_lesson_end |
| 课后未拨通 | after_class_no_call |
Step 1: 导航到CRM页面
URL: https://cc.vipthink.cn/#/student/cc_m_list?admin_group_list=8,70,172&main_type=today_lesson_endnn 注:北京上海团队使用 admin_group_list=8,70,154`n 注:台湾团队使用 admin_group_list=8,70,180
Step 2: 点击学生姓名(browser_evaluate)
var rows = document.querySelectorAll('.el-table__body-wrapper tbody tr');
rows[0].querySelector('td:nth-child(4) .el-button--text').click();
Step 3: 切换到电话标签(browser_evaluate)
var dialog = document.querySelectorAll('.el-dialog__wrapper')[11];
dialog.querySelectorAll('.el-tabs__item')[2].click();
Step 4: 筛选有效通话(>30秒)
列结构: 0=复选框, 1=拨打时间, 2=接听时间, 3=拨打人, 4=渠道, 5=拨通时长, 6=通话时长, 7=是否有效
条件: isValid === '是' && totalSeconds > 30
Step 5: 获取录音URL(browser_evaluate)
// 方法1:从audio元素获取
var audio = document.querySelector('audio');
var url = audio ? audio.src : null;
// 方法2:从下载按钮获取
if (!url) {
var btns = document.querySelectorAll('.el-button--text');
btns.forEach(function(btn) {
if (btn.textContent.includes('下载')) {
url = btn.getAttribute('href') || btn.onclick.toString().match(/'(https?:\/\/[^']+)'/);
}
});
}
// 方法3:从网络请求拦截
if (!url) {
var entries = performance.getEntriesByType('resource');
entries.forEach(function(e) {
if (e.name.includes('.mp3') || e.name.includes('.wav') || e.name.includes('oss')) {
url = e.name;
}
});
}
Step 6: 播放/验证录音
点击小喇叭播放验证
| 配置项 | 值 |
|---|---|
| -------- | ------ |
| DashScope API Key | sk-99f9364af58c49d5b927f43dc08e2e5c |
| ASR模型 | paraformer-v2 |
| ASR端点 | https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcription |
| 质检模型 | qwen-plus |
| 质检端点 | https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions |
model: paraformer-v2
input: file_urls: [录音URL]
parameters:
channel_id: [0]
language_hints: [zh, yue]
diarization_enabled: true
disfluency_removal_enabled: true
在ASR转录前,通过以下方式判断录音语言,优化转录准确率:
checkpoints: [{name, status(完成/未完成/部分完成), evidence, suggestion}]
score: 0-100
level: 优秀/合格/待改进
summary: 整体评价
customer_intent: 高/中/低
conversation_quality: 流畅/一般/生硬
key_phrases: [关键话术]
improvements: [改进建议]
报告包含8大模块:
| 模块 | 内容 |
|---|---|
| ------ | ------ |
| 总体概况 | 录音数、平均分、质量分布、趋势对比 |
| CC维度分析 | CC排名、详细表现、薄弱项识别 |
| 渠道维度分析 | 各渠道平均分、标准差 |
| 质检项完成情况 | 完成率可视化、薄弱项典型案例 |
| 客户意向分析 | 高/中/低意向分布及跟进建议 |
| 对话质量分析 | 流畅/一般/生硬分布 |
| 录音详细分析 | 每条录音完整质检项、关键话术、改进建议 |
| 行动建议 | 高意向客户清单、需补救CC、培训建议 |
在以下关键节点必须暂停并等待用户确认:
| 脚本 | 用途 | 位置 |
|---|---|---|
| ------ | ------ | ------ |
| batch_recording_analyzer_v2.py | 批量分析主脚本(并行+多维度报告) | d:\Trae工作内容\日常项目\scripts\ |
| pre_class_recording_analyzer.py | 单条课前录音分析脚本 | d:\Trae工作内容\日常项目\scripts\ |
el-table > el-table__body-wrapper > tbody > tr > td
cell 0: 复选框, cell 1: 组别, cell 2: CC名字, cell 3: 学生姓名, cell 4: 学生ID
el-dialog__wrapper > el-tabs > el-tabs__item: 跟进(0), 课程(1), 电话(2), 测网(3), 合同(4)
每行3个按钮: 听录音、下载录音、设为有效
| 目标 | CSS选择器/方法 |
|---|---|
| ------ | --------------- |
| 学生姓名按钮 | tr:nth-child(n) td:nth-child(4) .el-button--text |
| 电话标签 | .el-tabs__item:nth-child(3) |
| 听录音按钮 | tr:nth-child(n) .el-button--text |
| 小喇叭图标 | .icon-shengyin |
| 录音URL | audio元素src / 下载按钮href |
| 问题 | 解决方案 |
|---|---|
| ------ | --------- |
| browser_evaluate返回null | 检查preload脚本;刷新页面后重试 |
| 学生姓名snapshot不可见 | 使用JavaScript直接操作,不要依赖snapshot |
| 弹窗未出现 | 等待2秒后检查;确认点击的是正确元素 |
| 录音未播放 | 检查audio元素src是否为空 |
| cascader遮挡 | 点击弹窗关闭按钮会自动关闭cascader |
| CRM页面改版/选择器失效 | 使用browser_snapshot重新获取页面结构,对比现有选择器,动态适配新的CSS选择器 |
| 日期设值后页面数据空白 | 使用箭头刷新法:点击右箭头前进一天→点击左箭头回到目标日期,触发Vue响应式刷新 |
| 只获取到第一页数据 | 滚动到底部检查分页组件,遍历所有页获取完整数据;注意筛选可见且非disabled的next按钮 |
| 问题 | 解决方案 |
|---|---|
| ------ | --------- |
| ASR转录失败 | 检查录音URL是否过期(OSS签名7天有效);检查网络 |
| 质检分析返回404 | 确认使用 /compatible-mode/v1/ 端点 |
| API Key无效 | 确认使用DashScope API Key(sk-开头),非老版AccessKey |
| 粤语识别不准 | 确认language_hints包含yue |
| 转录乱码/识别率低 | 尝试单独使用 language_hints: [yue] 或 [zh] 重试 |
CRM的日期选择器使用Vue自定义组件,原生value setter无法触发Vue响应式更新。设值后页面数据可能为空白。
修复流程:
i.el-icon-arrow-right,位置约 y=131)前进一天i.el-icon-arrow-left,位置约 y=131)回到目标日期Playwright实现示例:
# 日期设值后检查是否空白
await page.wait_for_timeout(1500)
row_count = await page.locator('.el-table__body-wrapper .el-table__row').count()
if row_count == 0:
# 箭头刷新法:右→左触发Vue刷新
await page.locator('i.el-icon-arrow-right').first.click()
await page.wait_for_timeout(1000)
await page.locator('i.el-icon-arrow-left').first.click()
await page.wait_for_timeout(2000)
`
**browser_evaluate JS版本:**
// 箭头刷新法 - JS版本
document.querySelector('i.el-icon-arrow-right').click();
// 等待1秒后点击左箭头回到目标日期
setTimeout(function() {
document.querySelector('i.el-icon-arrow-left').click();
}, 1000);
// 再等待2秒让数据加载
// 翻页检查 - JS版本
var totalText = document.querySelector('.el-pagination__total').textContent;
var totalPages = parseInt(totalText.match(/共 (\d+) 页/)[1]);
var nextPageBtns = document.querySelectorAll('.btn-next');
// 筛选可见且非disabled的按钮
for (var i = 0; i < nextPageBtns.length; i++) {
var btn = nextPageBtns[i];
if (!btn.disabled && btn.offsetParent !== null) {
btn.click();
break;
}
}
### 原则2:数据全面性检查(翻页完整性)
CRM列表页面默认每页仅显示10条数据,实际数据可能有数十甚至上百条。**必须翻页获取全部数据,严禁只取第一页。**
**操作流程:**
1. 获取第一页数据后,滚动到页面底部检查分页组件
2. 读取分页信息:总条数、总页数、当前页码(`.el-pagination__total`等)
3. 如果总页数 > 1,逐页翻页获取所有数据
4. **翻页注意事项:**
- 页面可能存在多个`.btn-next`按钮(主分页 + 弹窗内分页),必须筛选**可见且非disabled**的按钮
- 每次翻页后等待2秒让数据加载完成
- 翻页前滚动到底部确保分页组件可见
- 获取的数据按唯一标识(如学员ID/录音ID)去重
**Playwright翻页实现示例:**
all_data = []
for pg in range(1, max_pages + 1):
if pg > 1:
await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
await page.wait_for_timeout(500)
# 找到可见且非disabled的next按钮
next_btns = page.locator('.el-pagination button.btn-next')
for idx in range(await next_btns.count()):
btn = next_btns.nth(idx)
if not await btn.is_disabled():
box = await btn.bounding_box()
if box and box['y'] > 0:
await btn.click()
break
await page.wait_for_timeout(2000)
# 提取当前页数据...
# 按唯一ID去重
## 注意事项
1. browser_evaluate是核心:Vue.js动态渲染的内容只有通过JavaScript才能可靠操作
2. URL参数控制筛选:不同团队/筛选条件通过admin_group_list和main_type控制
3. 等待加载:每次点击后等待1-2秒让Vue完成渲染
4. 录音URL有时效:OSS签名URL有效期约7天
5. API Key区分:DashScope API Key(sk-开头)用于ASR和质检,老版AccessKey不适用
6. 并行限流:批量分析时建议max_workers=3,避免API限流
7. 粤语支持:ASR需设置language_hints包含yue才能识别粤语
8. 检查点必停:到达CP1/CP2/CP3时必须等待用户确认,不可自动跳过
9. **日期筛选必须验证**:设值后检查数据是否加载,空白时立即使用箭头刷新法修复
10. **翻页必须完整**:任何列表操作(学员列表/通话记录/录音列表)都必须检查分页并获取全部数据,不可只取首页
## 版本历史
| 日期 | 版本 | 内容 |
|------|------|------|
| 2026-05-08 | 1.0 | CRM录音调取技能(团队筛选+学生定位+录音播放) |
| 2026-05-09 | 2.0 | 新增语音分析能力(ASR转录+AI质检+批量报告) |
| 2026-05-09 | 2.1 | 优化description触发词,解决AI无法识别调用问题 |
| 2026-05-11 | 2.2 | 全面优化:添加用户交互入口、检查点设计、Step5代码补全、语言自动检测、CRM改版fallback、资源路径具体化 |
| 2026-05-11 | 2.3 | 新增通用操作原则:日期筛选箭头刷新法(自我修复空白问题)+ 数据全面性翻页检查(学员列表&录音场景均适用) |
共 1 个版本