该服务使用 Amazon Transcribe 将语音数据转换为文本,是一个可以上传语音和视频文件的网页界面示例,进行语音转录和转录文本的邮件发送。
语音和视频数据存储在 Amazon Simple Storage Service 中,可以对最多2GB的日语、美式英语或英式英语录音内容进行转录。也支持说话人识别,可以识别1到10个说话人并进行转录。转录后的文本数据以邮件附件的形式,通过 Amazon Simple Email Service 发送到指定的地址。
另外,也支持 Amazon Transcribe 的自定义词汇功能(仅日语),可以注册转录时无法准确识别的词汇作为新词汇。比如,可以设置把“えーだぶりゅーえす”这样的发音转录为“AWS”。
前端采用 React v17 实现。后端由 AWS Lambda 的各个函数组成,使用 TypeScript 4.2 实现。
使用 AWS Cloud Development Kit 作为部署 AWS 资源的基础设施即代码工具,同样使用 TypeScript 4.2 实现。
部署本示例实现需要以下工具和配置:
- AWS 账号 https://aws.amazon.com/resources/create-account/
- AWS CLI https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html
- AWS CLI 配置 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html
- Node.js LTS + npm https://nodejs.org/en/download/
安装后,参考配置文件和凭证文件设置 创建凭证文件。
$ cd transcribe-ui-backend
## 编辑 cdk.json
"allowIpRange": ["设置允许的IP地址范围(CIDR)"]
$ cd transcribe-ui-backend
## 编辑 cdk.json
"fromAddress": "设置发件人电子邮件地址"
注意: 设置的邮件地址必须是 Amazon Simple Email Service 中验证状态为 verified 的地址。如果没有验证的地址,请在操作前在控制台上创建并完成验证。
$ cd transcribe-ui-backend
$ npm ci
$ npx cdk bootstrap
$ npx cdk deploy
部署时会询问是否进行部署,输入 y
。
是否部署这些更改?(y/n) y
在 AWS Secrets Manager 控制台打开 Transcribe-Secret
,在机密值中设置 AWS_SECRET_ACCESS_KEY
。
## 使用 CLI 更新
$ aws secretsmanager put-secret-value --secret-id "Transcribe-Secret" --secret-string "YOUR_AWS_SECRET_ACCESS_KEY"
$ cd transcribe-ui-frontend/frontend
$ npm ci
环境变量设置在 transcribe-ui-frontend/frontend/.env.production
:
- REACT_APP_API_ENDPOINT: 后端 API 的 URL
- REACT_APP_AWS_REGION: 应用运行的区域,东京区域为
ap-northeast-1
- REACT_APP_S3_BUCKET: 音频文件所在的 S3 Bucket 名称
- REACT_APP_AWS_ACCESS_KEY:
AWS_ACCESS_KEY_ID
值,与后端部署时使用的相同
示例:
## 编辑 transcribe-ui-frontend/frontend/.env.production
REACT_APP_API_ENDPOINT=https://be19f9example.execute-api.ap-northeast-1.amazonaws.com/prod/
REACT_APP_AWS_REGION=ap-northeast-1
REACT_APP_S3_BUCKET=bucket-transcribe-example-5a340a8c8c9
REACT_APP_AWS_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE
注意: 后端 API URL 和 S3 Bucket 名称在后端构建时会以如下格式输出:
Outputs:
...
Backend.TranscribeAPIsTranscribeAPIsrestapiEndpoint4376ABF0 = https://be19f9example.execute-api.ap-northeast-1.amazonaws.com/prod/
Backend.TranscribeStorageTranscribeStoragebucketname594F46DD = bucket-transcribe-example-5a340a8c8c9
...
$ cd transcribe-ui-frontend/frontend
$ npm run build
编辑 transcribe-ui-frontend/cdk.json
:
$ cd transcribe-ui-frontend
## 编辑 cdk.json
"allowIpRange": ["设置允许的 IP 地址范围(CIDR)"]
$ cd transcribe-ui-frontend
$ npm ci
$ npx cdk bootstrap
$ npx cdk deploy
部署时会询问是否进行部署,输入 y
。
是否部署这些更改?(y/n) y
Outputs:
frontend.frontendfrontendservicefrontendendpoint4E2DF9B7 = https://61ba9c9example.cloudfront.net
注意: 如果 WAF 部署的 IP 地址限制还未完成,可能需要一些时间。
- 更新自定义词汇时无法进行语音转文字。为尽量减少影响,本示例实现了每天定期更新,反映内容变更,自定义词汇的页面操作不会立即反映在语音转文字结果中。关于更新频率的调整请查看 CDK 的实现。
- 邮件发送使用 Amazon Simple Email Service (SES)。默认情况下,通过 SES 发送的邮件,可设置的源地址和目标地址仅限于在 SES 中预先验证的地址。
- 如果需要向任意邮件地址发送邮件,请参考此文档解除 SES 沙盒限制。
启动语音文件的语音转文字处理。转文字结果以附件形式发送到设置的邮件地址。
请求
{
"file": "sample.mp3",
"addr": "recipient@example.com",
"num": 2,
"lang": "zh-CN"
}
响应
{ "job": "job-1608868080-sample_amazoncojp-de95example" }
获取自定义词汇列表。
响应
[
{ "phrase": "āmǎzōng", "display": "亚马逊" },
{ "phrase": "Āwùshì", "display": "AWS" }
]
添加自定义词汇。添加的自定义词汇需要一定时间才能反映到语音转文字中,不是立即反映。请注意。
请求
[
{ "phrase": "āmǎzōng", "display": "亚马逊" },
{ "phrase": "Āwùshì", "display": "AWS" }
]
响应
{ "n": 2 }
注意: 更新自定义词汇时,使用这些自定义词汇的所有语音转文字处理都会失败。
删除任意自定义词汇。
请求
[
{ "phrase": "āmǎzōng", "display": "亚马逊" },
{ "phrase": "Āwùshì", "display": "AWS" }
]
响应
{ "n": 2 }
注意: 更新自定义词汇时,使用这些自定义词汇的所有语音转文字处理都会失败。
根据规范请求签名字符串。本系统用于对前端上传文件到 S3 的请求进行签名。
请求
{
// 规范请求
canonical_request:
'POST\n' +
'/sample.mp3\n' +
'uploadId=0974a41c58834e2540563d88example\n' +
'content-type:application/xml; charset=UTF-8\n' +
'host:s3-ap-northeast-1.amazonaws.com\n' +
'x-amz-date:20201201T000000Z\n\n' +
'content-type;host;x-amz-date\n' +
'5cf18144e2540bd37de955b905883563d8869f535535509c2da094a41example',
// 签名字符串
to_sign:
'AWS4-HMAC-SHA256\n' +
'20201201T000000Z\n' +
'20201201/ap-northeast-1/s3/aws4_request\n' +
'5cf18144e2540bd37de955b905883563d8869f535535509c2da094a41example',
datetime: '20201201T000000Z'
}
响应
5cf18144e2540bd37de955b905883563d8869f535535509c2da094a41example
{ "error": "failureReason" }
更多信息请查看 CONTRIBUTING。
该库使用 MIT-0 许可证授权。请查看 LICENSE 文件。