
本文介绍一种在 laravel 中处理 aws transcribe 输出的实用方法,通过合并同说话人连续语段、对齐时间戳与词项,将原始 json 结果转换为清晰的「说话人 + 对话内容」结构化数组。
本文介绍一种在 laravel 中处理 aws transcribe 输出的实用方法,通过合并同说话人连续语段、对齐时间戳与词项,将原始 json 结果转换为清晰的「说话人 + 对话内容」结构化数组。
AWS Transcribe 的语音识别结果(尤其是启用了 Speaker Identification 的输出)默认以两个嵌套结构返回:
- results.speaker_labels.segments:标注了每个说话人片段的起止时间及所属 speaker_label;
- results.items:包含所有识别出的词项(words/phrases),但未直接关联 speaker,仅含 start_time 和 end_time。
由于 Transcribe 不保证 items 中每个词都携带时间戳(尤其静音或停顿处可能缺失),且 segments 中的 items 字段仅作示意、实际常为空或不完整,因此需手动对齐二者。以下 convertTextToSpeakers() 方法正是为此设计:
public function convertTextToSpeakers($response)
{
$segments = $response['results']['speaker_labels']['segments'] ?? [];
$items = $response['results']['items'] ?? [];
$result = [];
// Step 1: 补全缺失时间戳的 items(常见于标点或静音填充项)
foreach ($items as $key => $item) {
if (!isset($item['start_time']) && $key > 0) {
$prev = $items[$key - 1];
$items[$key] = array_merge($item, [
'start_time' => $prev['start_time'] ?? null,
'end_time' => $prev['end_time'] ?? null,
]);
}
}
// Step 2: 合并相邻且 speaker 相同的 segments(解决跨 segment 的同一说话人断续问题)
$segments = collect($segments)->sortBy('start_time')->values()->all();
for ($i = 0; $i filter(fn($item) => isset($item['start_time'], $item['end_time']));
foreach (collect($segments)->sortBy('start_time') as $segment) {
$text = '';
$segmentItems = collect($segment['items'] ?? [])->filter(fn($si) =>
isset($si['start_time'], $si['end_time'])
)->sortBy('start_time');
foreach ($segmentItems as $segItem) {
// 精确匹配 start_time & end_time(避免因浮点精度导致漏匹配)
$matchedWords = $itemsCollection->filter(function ($word) use ($segItem) {
return abs((float)$word['start_time'] - (float)$segItem['start_time']) $segment['speaker_label'] ?? 'unknown',
'text' => trim($text),
];
}
return $result;
}
✅ 关键优化说明:
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 自动补全无时间戳项,防止后续匹配失败;
- 支持相邻同 speaker segment 的递归合并,提升对话连贯性;
- 使用浮点容差(
- 过滤无效 content 并规范空格,确保输出文本可读性强。
⚠️ 注意事项:
- 该方法依赖 speaker_labels 和 items 均已启用(即调用 Transcribe 时设置 EnableSpeakerLabeling = true 且 OutputBucketName 或 OutputKey 配置正确);
- 若音频信噪比低或多人重叠讲话,speaker 标签准确率会下降,建议结合业务场景做后处理校验;
- 生产环境建议增加输入校验(如检查 $response 结构完整性)和异常兜底逻辑。
最终返回格式示例:
[
{ "speaker": "spk_0", "text": "Hello, how are you today?" },
{ "speaker": "spk_1", "text": "I'm doing well, thanks for asking." }
]
可直接用于字幕生成、会议纪要提取或对话分析系统。










