Files
sionrui/docs/cosyvoice-ram-config.md
2025-11-19 21:57:16 +08:00

4.1 KiB
Raw Blame History

CosyVoice访问OSS配置指南

问题说明

CosyVoice复刻服务需要访问OSS存储的音频文件但默认情况下CosyVoice没有访问用户OSS的权限。

解决方案配置RAM权限

1. 创建RAM角色

在阿里云RAM控制台创建角色允许CosyVoice服务访问OSS

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:GetObject",
        "oss:HeadObject"
      ],
      "Resource": [
        "acs:oss:*:*:{bucket-name}/*"
      ]
    }
  ]
}

参数说明:

  • {bucket-name}替换为你的OSS存储桶名称

2. 配置信任策略

为RAM角色添加信任策略允许DashScope服务扮演该角色

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "dashscope.aliyuncs.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3. 授权步骤(控制台操作)

步骤1创建自定义权限策略

  1. 登录阿里云控制台 → 访问控制(RAM) → 权限管理 → 权限策略
  2. 点击"创建策略"
  3. 选择"脚本配置"
  4. 粘贴上述JSON权限策略
  5. 策略名称:CosyVoice-OSS-Access
  6. 点击"确定"

步骤2创建RAM角色

  1. RAM → 身份管理 → 角色 → 创建角色
  2. 选择"阿里云服务" → "DashScope"
  3. 输入角色名称:CosyVoice-OSS-Role
  4. 完成创建

步骤3授权角色访问OSS

  1. 在角色详情页面,点击"添加权限"
  2. 搜索并添加:
    • AliyunOSSReadOnlyAccess阿里云OSS只读权限
    • CosyVoice-OSS-Access(自定义权限)
  3. 点击"确定"

步骤4获取ARN 在角色详情页面,复制"ARN"

acs:ram::{你的AccountID}:role/CosyVoice-OSS-Role

4. 配置application.yaml

yudao-server/src/main/resources/application.yaml 中添加:

yudao:
  cosyvoice:
    # ... 其他配置
    # RAM角色ARN用于授权CosyVoice访问OSS
    ram-role-arn: "acs:ram::{AccountID}:role/CosyVoice-OSS-Role"

5. 修改OSS访问方式

CosyVoiceClient.buildClonePayload() 中,添加授权信息:

// 在请求头中添加Authorization
Request httpRequest = new Request.Builder()
        .url(properties.getVoiceEnrollmentUrl())
        .addHeader("Authorization", "Bearer " + properties.getApiKey())
        .addHeader("Content-Type", "application/json")
        // 添加STS临时凭证需要先调用AssumeRole获取临时凭证
        .addHeader("x-acs-security-token", "{security-token}")
        .post(RequestBody.create(payload.getBytes(StandardCharsets.UTF_8), JSON))
        .build();

6. 获取STS临时凭证Java代码

import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;

public String getSecurityToken() {
    // 需要配置RAM角色ARN和访问密钥
    AssumeRoleRequest request = new AssumeRoleRequest()
            .setRoleArn(properties.getRamRoleArn())
            .setRoleSessionName("cosyvoice-session");

    AssumeRoleResponse response = client.assumeRole(request);
    return response.body.credentials.securityToken;
}

7. 完整实现思路

  1. 本地开发使用STS临时凭证
  2. 生产环境
    • 方案A配置RAM角色让CosyVoice直接访问OSS
    • 方案B将音频文件上传到CosyVoice可访问的公共OSS存储桶

替代方案使用公共OSS存储桶

如果RAM权限配置复杂可以

  1. 创建公共可读的OSS存储桶
  2. 将音频文件上传到该存储桶
  3. 使用公共URL进行复刻

注意:公共存储桶存在安全风险,仅用于测试!

验证配置

配置完成后,重新测试语音复刻功能:

  1. 查看日志中的请求URL是否可公网访问
  2. 查看是否还有"url error"错误
  3. 查看复刻是否成功返回voice_id

参考资料