zoukankan      html  css  js  c++  java
  • 利用 AWS 无服务架构之语音合成

    一、架构图

    1. 用户通过前段网页输入文字,通过后台一系列服务转换成语音,并在前段展示,并提供下载功能,整个服务没有使用一台服务器!
    2. 用户输入文字进行提交;
    3. 页面通过 API 代码把信息传递给 Lamdba 函数 NewPost 写入 DynamoDB,并把 postId 传递给 SNS;
    4. SNS 把 postId 传递给 Lambda 函数 Convert,函数 Convert 通过 postId 去 DynamoDB 查询文本数据,并调用 Polly 进行语音合成;
    5. 函数 Convert 把合成的语音文件存入 S3 中,更更新数据库状态;
    6. 用户就可以通过 GET 去获取语音合成的相关信息。

    二、服务部署

    2.1、创建 DynamoDB 表

    很简单,写个表名,写个主键即可,其他默认。

    Table name:posts
    Primary key:id

    2.2、创建 S3

    我们创建两个 S3 存储桶,一个用来存放静态网页,一个用来存放语音合成的音频。

    2.2.1 静态网页存储桶

    • 名称大家随意确定,我这里起的名字为 pollywebsite;
    • 打开公共访问权限;
    • 启用静态网站托管功能;
    • 添加存储桶策略,以便公共用户可以访问,策略如下:
    {
        "Version": "2012-10-17",
        "Id": "Policy1562738599054",
        "Statement": [
            {
                "Sid": "Stmt1562738571491",
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::wz-pollywebsite/*"
            }
        ]
    }
    

    2.2.2、音频存储桶

    • 名字大家随意定,我这里起名字为 pollyaudio;
    • 打开公共访问权限。

    2.3、创建 SNS Topic

    • 名称大家随意定,我这里起名字为 new_posts。

    2.4、为 Lambda 创建权限

    从架构图得知,我们的 Lambda 函数和多个组件进行交互,需要有相关的权限才行,我们通过 IAM 为其创建一个 Role。

    • 在选择的服务使用此 Role 处选择 Lambda;
    • 先不用添加 Policy,先创建好 Role;
    • 角色名大家可以随意写,我这里起名为 LamdbaPostsReaderRole;
    • 为 Role 添加 Inline Policy,策略规则如下:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "polly:SynthesizeSpeech",
                    "logs:CreateLogStream",
                    "sns:Publish",
                    "dynamodb:PutItem",
                    "dynamodb:Scan",
                    "dynamodb:Query",
                    "dynamodb:UpdateItem",
                    "s3:GetBucketLocation",
                    "logs:CreateLogGroup",
                    "logs:PutLogEvents",
                    "s3:PutObjectAcl"
                ],
                "Resource": "*"
            }
        ]
    }
    

    2.5、创建 Lambda NewPost

    • 函数名大家自己随意写,我这里写 wz_NewPost;
    • 运行环境大家选择 Python 3.7。
    • 填写好相关的 Python 代码,并配置好代码环境变量;
    • 为函数指定我们前面创建的角色。

    2.6、创建 Lambda GetPosts

    • 函数名大家自己随意写,我这里写 wz_GetPosts;
    • 运行环境大家选择 Python 3.7。
    • 填写好相关的 Python 代码,并配置好代码环境变量;
    • 为函数指定我们前面创建的角色。

    2.7、创建 Lambda Convert

    • 函数名大家自己随意写,我这里写 wz_ConvertToAudio;
    • 运行环境大家选择 Python 3.7。
    • 填写好相关的 Python 代码,并配置好代码环境变量;
    • 为函数指定我们前面创建的角色;
    • 这个函数耗时比较长,可以把函数执行时间调整为一分钟;
    • 添加我们创建的 SNS 为触发器。

    2.8、创建 API Gateway

    • API 名称大家随意写,我这里写 PostReaderAPI,风格为 REST;
    • 创建一个 GET 方法,选择wz_GetPosts函数,添加 URL Query String Parameters;
    • GET 方法启用 CORS;
    • 创建 Mapping Templates,类型为 application/json,内容如下:
    {
        "postId" : "$input.params('postId')"
    }
    
    • 创建一个 POST 方法,选择wz_GetPosts函数。

    2.9、上传前端代码到 S3

    2.10、创建域名解析

    注意,如果域名别名解析到 S3 存储桶,存储桶的名称必须和域名一致,所以我要修改一下存储桶 website 的名称。

    三、验证

    测试地址: http://polly.wzlinux.com
    部署教程视频:https://edu.51cto.com/course/18818.html

  • 相关阅读:
    get和post的区别?
    JSP中动态include和静态include的区别?
    怎么防止重复提交
    如何解决表单提交的中文乱码问题
    http的响应码200,404,302,500表示的含义分别是?
    JSP三大指令是什么?
    session 和 cookie 有什么区别?
    Servlet API中forward()与redirect()的区别?
    Servlet的生命周期
    爬虫之Xpath的使用
  • 原文地址:https://www.cnblogs.com/wzlinux/p/11188608.html
Copyright © 2011-2022 走看看