亚马逊alexa创建语音技能图文教程

发布时间:2022-11-01 20:30:14 作者:yexindonglai@163.com 阅读(232)

1、注册并登录亚马逊

自行注册账号就行,不需要银行卡什么的

2、开始配置技能

1、打开网站 https://developer.amazon.com/zh/进入亚马逊开发页面,然后点击 “alexa” 按钮进入技能配置页面

2、技能说明
点击create Alexa Skills

3、介绍页
点击create Alexa Skills 后会进入一个介绍页面,有需要的可以看下介绍,然后点击 console 按钮进入控制台页面

4、控制台
直接点此链接也可进入控制台:https://developer.amazon.com/alexa/console/ask,
因为现在还没有技能,所有我们需要先创建一个技能出来,点击create skill按钮

5、创建技能
依次填写技能名称、语言环境、模式(选择智能家具)

6、配置技能
这里有一点需要说明下,亚马逊的语音控制需要配合 Lamdba 使用, 每一个区域使用不同的端点, 下面会讲解如何配置lambda

3、配置lambda

1、 打开链接: https://us-east-1.console.aws.amazon.com/console/home?nc2=h_ct&region=us-east-1&src=header-signin#

点击 lambda 按钮

2、创建lambda
点击创建函数按钮

3、填写创建信息
依次填写 函数名称、运行时环境,其他默认既然,然后点击创建函数按钮

创建后如下图,注意:其中的 函数 ARN 就是我们等下需要用到的 端点,而右上角就是端点所在的区域,每个区域都有不同的端点

4、函数代码

接下来我们需要上传自己的函数代码,在上传之前,先来看看代码

pom.xml 文件内容如下

  1. <properties>
  2. <maven.compiler.source>8</maven.compiler.source>
  3. <maven.compiler.target>8</maven.compiler.target>
  4. </properties>
  5. <dependencies>
  6. <dependency>
  7. <groupId>cn.hutool</groupId>
  8. <artifactId>hutool-all</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework</groupId>
  12. <artifactId>spring-web</artifactId>
  13. </dependency>
  14. <!-- aws iot -->
  15. <dependency>
  16. <groupId>com.amazonaws</groupId>
  17. <artifactId>aws-iot-device-sdk-java</artifactId>
  18. <version>1.2.0</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.amazonaws</groupId>
  22. <artifactId>aws-iot-device-sdk-java-samples</artifactId>
  23. <version>1.2.0</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.amazonaws</groupId>
  27. <artifactId>aws-lambda-java-core</artifactId>
  28. <version>1.2.1</version>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <finalName>rinoiot-common-alexa-${profiles.active}</finalName>
  33. <plugins>
  34. <plugin>
  35. <groupId>org.apache.maven.plugins</groupId>
  36. <artifactId>maven-shade-plugin</artifactId>
  37. <version>2.3</version>
  38. <configuration>
  39. <createDependencyReducedPom>false</createDependencyReducedPom>
  40. </configuration>
  41. <executions>
  42. <execution>
  43. <phase>package</phase>
  44. <goals>
  45. <goal>shade</goal>
  46. </goals>
  47. </execution>
  48. </executions>
  49. </plugin>
  50. </plugins>
  51. <resources>
  52. <resource>
  53. <directory>src/main/resources/</directory>
  54. <excludes>
  55. <exclude>dev/*</exclude>
  56. <exclude>test/*</exclude>
  57. <exclude>prod/*</exclude>
  58. </excludes>
  59. </resource>
  60. <resource>
  61. <directory>src/main/resources/${profiles.active}</directory>
  62. </resource>
  63. </resources>
  64. </build>
  65. <!-- 执行打包命令,如:mvn clean package -Pprod-->
  66. <profiles>
  67. <profile>
  68. <id>dev</id>
  69. <properties>
  70. <profiles.active>dev</profiles.active>
  71. </properties>
  72. <activation>
  73. <activeByDefault>true</activeByDefault>
  74. </activation>
  75. </profile>
  76. <profile>
  77. <id>test</id>
  78. <properties>
  79. <profiles.active>test</profiles.active>
  80. </properties>
  81. </profile>
  82. <profile>
  83. <id>prod</id>
  84. <properties>
  85. <profiles.active>prod</profiles.active>
  86. </properties>
  87. </profile>
  88. </profiles>

AlexaResponse.java 文件内容如下

  1. package com.rinoiot.alexa.vo;
  2. import lombok.Getter;
  3. import lombok.Setter;
  4. import java.io.Serializable;
  5. @Getter
  6. @Setter
  7. public class AlexaResponse<T> implements Serializable {
  8. /** 请求ID **/
  9. private String reqId;
  10. /** 请求时间戳(10位) **/
  11. private Long time;
  12. /** 响应状态码 **/
  13. private int code;
  14. /** 响应消息 **/
  15. private String message;
  16. /** 响应数据 **/
  17. private T data;
  18. }

AlexaHandler.java 文件内容如下

  1. package com.rinoiot.alexa;
  2. import cn.hutool.core.io.resource.ResourceUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import cn.hutool.json.JSONUtil;
  5. import com.amazonaws.services.lambda.runtime.Context;
  6. import com.amazonaws.services.lambda.runtime.LambdaLogger;
  7. import com.amazonaws.services.lambda.runtime.RequestHandler;
  8. import com.rinoiot.alexa.vo.AlexaResponse;
  9. import org.springframework.http.HttpEntity;
  10. import org.springframework.http.HttpHeaders;
  11. import org.springframework.http.HttpMethod;
  12. import org.springframework.http.ResponseEntity;
  13. import org.springframework.web.client.HttpServerErrorException;
  14. import org.springframework.web.client.RestTemplate;
  15. import java.util.Map;
  16. import java.util.Properties;
  17. public class AlexaHandler implements RequestHandler<Map<String,Object>, Object> {
  18. private String requestUrl = null;
  19. private RestTemplate restTemplate = new RestTemplate();
  20. @Override
  21. public Object handleRequest(Map<String, Object> event, Context context) {
  22. // LambdaLogger logger = context.getLogger();
  23. LambdaLogger logger = null;
  24. loadApiUrl(logger);
  25. String json = request(event,logger);
  26. AlexaResponse response = JSONUtil.parseObj(json).toBean(AlexaResponse.class);
  27. return response.getData();
  28. }
  29. protected String request(Map<String, Object> event,LambdaLogger logger){
  30. String body = JSONUtil.toJsonStr(event);
  31. HttpHeaders headers = getHeaders();
  32. String response = "";
  33. long time = System.currentTimeMillis();
  34. try {
  35. ResponseEntity<String> responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, new HttpEntity(body,headers), String.class);
  36. response = responseEntity.getBody();
  37. } catch (HttpServerErrorException e){
  38. response = e.getResponseBodyAsString();
  39. logger.log(StrUtil.format("亚马逊AlexaAPI, 调用失败. error:{}",response));
  40. }catch (Exception e){
  41. response = e.getMessage();
  42. logger.log(StrUtil.format("亚马逊AlexaAPI, 调用失败. error:{}",e.getMessage()));
  43. }finally {
  44. Long curTime = System.currentTimeMillis();
  45. logger.log(StrUtil.format("亚马逊AlexaAPI, apiUrl:{}, 耗时:{}ms, body:{}, response:{}", requestUrl,(curTime-time),body,response));
  46. }
  47. return response;
  48. }
  49. private HttpHeaders getHeaders() {
  50. HttpHeaders headers = new HttpHeaders();
  51. headers.add("Content-Type", "application/json;charset=UTF-8");
  52. return headers;
  53. }
  54. public void loadApiUrl(LambdaLogger logger){
  55. if(StrUtil.isEmpty(requestUrl)){
  56. Properties properties = new Properties();
  57. try {
  58. properties.load(ResourceUtil.getStream("config.properties"));
  59. requestUrl = (String) properties.get("requestUrl");
  60. System.out.println(requestUrl);
  61. } catch (Exception e) {
  62. logger.log(StrUtil.format("加载requestUrl失败. error:{}",e.getMessage()));
  63. }
  64. }
  65. }
  66. public static void main(String[] args) {
  67. AlexaHandler handler = new AlexaHandler();
  68. handler.loadApiUrl(null);
  69. }
  70. }

config.properties 文件内容如下

  1. requestUrl=https://yexindong.hnlhzw.cn/trd-service/v1/alexa/service

最后看看java代码的项目结构

5、打包
输入以下命令将项目打成jar包,其中 dev表示环境

  1. mvn clean package -Pdev

6、上传函数jar包

再次回到刚才的页面,因为我缩写的语言是java,所以我选择的文件是jar包;

将刚才打包好的jar包上传到亚马逊,因为是国外网站,有可能会上传失败,多试几次就好;

7、修改处理程序的方法

点击运行时设置的编辑按钮

将处理程序改为你的 全类名 + 方法明 : com.rinoiot.alexa.AlexaHandler::handleRequest,其中 :

  • com.rinoiot.alexa.AlexaHandler 是全类名
  • handleRequest是方法名称

最后点击保存按钮

修改完成

8、添加触发器

点击 添加触发器 按钮

之后我们需要选择一个源

我们用的是语音控制,所以选择 alexa

在技能控制台将技能编号复制过去,然后点击添加按钮

到此,一个触发器就创建好了

9、复制端点
将 lambda中的函数 ARN 复制到 技能的默认端点北美端点

10、配置关联账号

填写相应的授权信息,使用auth2.0协议

需要注意的是,身份验证方案这一栏,要选择 请求正文中的凭据

关键字音视频开发