likes
comments
collection
share

一文教你智能交互音频如何直传OSS

作者站长头像
站长
· 阅读数 15

1. 背景

这一次带来的是做需求的一次记录。最近在做AI直播间的语音翻译。那么本次用到了阿里云的只能语音交互和阿里云的oss服务。

首先就是阿里云的只能语音交互:nls-portal.console.aliyun.com/overview

oss服务就直接去阿里云的官方搜索就好了,这个用的比较多。

2. 技术概述

2.1. 概述

一文教你智能交互音频如何直传OSS

  1. 当用于进入到直播间时。前端会检测到xxx用户进入直播间。捕获到这个信息以后。前端将用户用户昵称传给服务端。
  2. 服务端将昵称与配置好的欢迎文案拼接好,调用阿里云智能语音生成音频。
  3. 阿里云智能语音根据指定的音频合成模型,生成对应的音频文件。
  4. 服务端拿到对应的音频流,调用oss服务将音频流上传到对应的服务端。
  5. 上传完成以后,将音频链接返回给前端。前端播放对应的音频文件。

2.2. 创建音频项目

  1. nls-portal.console.aliyun.com/applist 登录阿里云以后开通只能语音交互。
  2. 创建对应的项目一文教你智能交互音频如何直传OSS
  3. 修改配置一文教你智能交互音频如何直传OSS
  4. 选择自己想要合成的语音一文教你智能交互音频如何直传OSS

3. 技术实现

3.1. 生成token

    /**
     * 获取token
     *
     * @return 
     * @throws IOException
     */
    private static String getToken() throws IOException {
        AccessToken accessToken = new AccessToken("accessKeyId", "accessKeySecret");
        accessToken.apply();
        String token = accessToken.getToken();
        return token;
    }

3.2. 生成对应的音频流文件

private void processGETRequest(String appkey, String accessToken, String text, String format, int sampleRate, String voice, String filePath) {
        /**
         * 设置HTTPS GET请求:
         * 1.使用HTTPS协议
         * 2.语音识别服务域名:nls-gateway-cn-shanghai.aliyuncs.com
         * 3.语音识别接口请求路径:/stream/v1/tts
         * 4.设置必须请求参数:appkey、token、text、format、sample_rate
         * 5.设置可选请求参数:voice、volume、speech_rate、pitch_rate
         */
        String url = "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts";
        url = url + "?appkey=" + appkey;
        url = url + "&token=" + accessToken;
        url = url + "&text=" + text;
        url = url + "&format=" + format;
        url = url + "&voice=" + voice;
        url = url + "&sample_rate=" + sampleRate;

        /**
         * 发送HTTPS GET请求,处理服务端的响应。
         */
        Request request = new Request.Builder().url(url).get().build();
        try {
            OkHttpClient client = new OkHttpClient();
            Response response = client.newCall(request).execute();
            String contentType = response.header("Content-Type");
            if ("audio/mpeg".equals(contentType)) {
                byte[] bytes = response.body().bytes();
                ossService.ossUploadByStream(filePath, new ByteArrayInputStream(bytes));
            } else {
                String errorMessage = response.body().string();
            }
            response.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.3. 音频流文件上传到oss

public void ossUploadByStream(String filePath, InputStream input) {
        OSS ossClient = new OSSClientBuilder().build(aLiYunConfig.getEndpoint(), aLiYunConfig.getAccessKeyId(),
            aLiYunConfig.getSecretAccessKey());
        PutObjectRequest putObjectRequest = new PutObjectRequest(aLiYunConfig.getBucketName(), filePath, input);
        ossClient.putObject(putObjectRequest);
        ossClient.shutdown();
    }

4. 总结

  1. 对于音频的生成,直接保存到oss,这样就不需要占用服务器的内存。直接上传到oss服务。更加的方便使用。
  2. 需要注意的是,音频的生成需要自己多读读文档。官方也提供了sdk。也可以直接使用。