/amazon-aitranslate-web-ui-demo

This is a web application sample that uses Amazon Transcribe to convert uploaded audio files into text and send mail it via Amazon SES.

Primary LanguageTypeScriptMIT No AttributionMIT-0

语音转文字系统

概览

该服务使用 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 实现。

架构图

截图

截图1

截图2

构建步骤

0. 前提条件

部署本示例实现需要以下工具和配置:

安装后,参考配置文件和凭证文件设置 创建凭证文件。

1. 设置允许访问 API 的 IP 范围

$ cd transcribe-ui-backend 

## 编辑 cdk.json
"allowIpRange": ["设置允许的IP地址范围(CIDR)"]

2. 设置发送转录结果邮件的发件人地址

$ cd transcribe-ui-backend

## 编辑 cdk.json 
"fromAddress": "设置发件人电子邮件地址"

注意: 设置的邮件地址必须是 Amazon Simple Email Service 中验证状态为 verified 的地址。如果没有验证的地址,请在操作前在控制台上创建并完成验证。

3. 部署 CDK 堆栈到任意环境

$ cd transcribe-ui-backend
$ npm ci
$ npx cdk bootstrap
$ npx cdk deploy

部署时会询问是否进行部署,输入 y

是否部署这些更改?(y/n) y

4. 在 Secrets Manager 中注册机密信息

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" 

5. 安装前端应用所需的模块库

$ cd transcribe-ui-frontend/frontend 
$ npm ci

6. 设置前端使用的环境变量

环境变量设置在 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
...

7. 构建前端应用

$ cd transcribe-ui-frontend/frontend
$ npm run build

8. 设置允许访问前端的 IP 范围

编辑 transcribe-ui-frontend/cdk.json:

$ cd transcribe-ui-frontend

## 编辑 cdk.json
"allowIpRange": ["设置允许的 IP 地址范围(CIDR)"]

9. 部署 CDK 堆栈到任意环境

$ cd transcribe-ui-frontend
$ npm ci
$ npx cdk bootstrap
$ npx cdk deploy

部署时会询问是否进行部署,输入 y

是否部署这些更改?(y/n) y

10. 部署完成后,访问输出的 URL 进行功能验证。

Outputs:
frontend.frontendfrontendservicefrontendendpoint4E2DF9B7 = https://61ba9c9example.cloudfront.net

注意: 如果 WAF 部署的 IP 地址限制还未完成,可能需要一些时间。

注意事项

  • 更新自定义词汇时无法进行语音转文字。为尽量减少影响,本示例实现了每天定期更新,反映内容变更,自定义词汇的页面操作不会立即反映在语音转文字结果中。关于更新频率的调整请查看 CDK 的实现。
  • 邮件发送使用 Amazon Simple Email Service (SES)。默认情况下,通过 SES 发送的邮件,可设置的源地址和目标地址仅限于在 SES 中预先验证的地址。
    • 如果需要向任意邮件地址发送邮件,请参考此文档解除 SES 沙盒限制。

API 规范

/transcribe

POST

启动语音文件的语音转文字处理。转文字结果以附件形式发送到设置的邮件地址。

请求

{
  "file": "sample.mp3",
  "addr": "recipient@example.com", 
  "num": 2,
  "lang": "zh-CN" 
}

响应

{ "job": "job-1608868080-sample_amazoncojp-de95example" }

/vocabularies

GET

获取自定义词汇列表。

响应

[
  { "phrase": "āmǎzōng", "display": "亚马逊" },
  { "phrase": "Āwùshì", "display": "AWS" }  
]

POST

添加自定义词汇。添加的自定义词汇需要一定时间才能反映到语音转文字中,不是立即反映。请注意。

请求

[
  { "phrase": "āmǎzōng", "display": "亚马逊" },
  { "phrase": "Āwùshì", "display": "AWS" }
]

响应

{ "n": 2 }

注意: 更新自定义词汇时,使用这些自定义词汇的所有语音转文字处理都会失败。

DELETE

删除任意自定义词汇。

请求

[
  { "phrase": "āmǎzōng", "display": "亚马逊" }, 
  { "phrase": "Āwùshì", "display": "AWS" }
]

响应

{ "n": 2 }

注意: 更新自定义词汇时,使用这些自定义词汇的所有语音转文字处理都会失败。

/sign

GET

根据规范请求签名字符串。本系统用于对前端上传文件到 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 文件。