如何基于Laravel实现适配AWS UI的Transcribe音频识别功能
Laravel 实现对齐AWS官方UI功能的Transcribe音频识别方案
我之前花了很长时间检索AWS Transcribe音频识别的各类实现方案,始终没找到和AWS当前官方控制台UI提供的功能完全匹配的可参考实现,索性基于Laravel框架自主完成了整套对应功能的开发,现在把实现方案整理出来,给同样在找对应方案的开发者省点折腾的时间。
前置依赖配置
- 先在Laravel项目中安装AWS PHP SDK依赖:
composer require aws/aws-sdk-php-laravel - 到AWS IAM控制台给当前使用的访问密钥配置
AmazonTranscribeFullAccess权限,同时给对应S3存储桶开放读写权限——AWS Transcribe的批量识别任务默认需要从S3读取源音频,识别结果也会默认输出到指定S3桶 - 在项目
.env文件中补充必要配置项:AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION、AWS_TRANSCRIBE_S3_BUCKET
核心功能实现(1:1对齐官方UI能力)
- 识别任务提交:支持官方UI覆盖的所有音频格式(mp3、wav、flac、m4a等),可配置自动语言检测、指定识别语言、说话人分离、自定义词汇表、自定义语言模型等所有控制台可见选项,核心提交代码参考:
// 初始化Transcribe服务客户端 $transcribeClient = app('aws')->createClient('transcribe'); $taskParam = [ 'TranscriptionJobName' => 'transcribe_job_'.uniqid(), 'MediaFormat' => $audioFile->getClientOriginalExtension(), 'Media' => [ 'MediaFileUri' => 's3://'.env('AWS_TRANSCRIBE_S3_BUCKET').'/'.$s3StoredAudioPath ], 'OutputBucketName' => env('AWS_TRANSCRIBE_S3_BUCKET'), // 自动语言检测开关和手动指定语言二选一 'IdentifyLanguage' => $request->input('auto_detect_lang', false), 'LanguageCode' => $request->input('auto_detect_lang') ? null : $request->input('lang_code'), // 对齐官方UI的高级配置 'Settings' => [ 'ShowSpeakerLabels' => $request->input('enable_speaker_split', false), 'MaxSpeakerLabels' => $request->input('max_speaker_num', 2), 'VocabularyName' => $request->input('custom_vocab_name'), 'ShowAlternatives' => $request->input('show_alt_result', false) ] ]; $transcribeClient->startTranscriptionJob($taskParam);
- 任务状态同步:和官方UI的状态展示逻辑一致,覆盖排队中、处理中、识别完成、识别失败四种状态,建议搭配Laravel自带队列做定时状态轮询,不要用前端高频轮询拉取接口,容易触发AWS接口限流
- 识别结果解析:识别完成后AWS会自动把结构化json结果存到你指定的S3桶里,直接读取解析这个json文件就能拿到和官方UI展示完全一致的带时间戳、说话人标签、标点的识别内容,不需要额外做格式转换
- 附加能力适配:官方UI提供的内容安全过滤、自动标点、批量字幕生成等功能,只需要在提交任务时按API文档补充对应参数即可,不需要做额外的二次开发
注意事项
网上能搜到的大部分AWS Transcribe Laravel实现都是服务刚上线时的旧版本封装,不支持现在官方控制台的说话人分离、自动语言检测等新特性,不要直接套用旧封装,对照最新版官方API传参就能1:1还原所有控制台功能
时长超过2小时的音频不要用实时识别接口,和官方控制台一样走异步批量任务接口,识别准确率、处理速度和控制台发起的任务完全一致
内容的提问来源于stack exchange,提问作者King Eke
相关产品推荐
相关产品推荐

