Files
sionrui/docs/cosyvoice-ram-config.md

157 lines
4.1 KiB
Markdown
Raw Normal View History

2025-11-19 21:57:16 +08:00
# CosyVoice访问OSS配置指南
## 问题说明
CosyVoice复刻服务需要访问OSS存储的音频文件但默认情况下CosyVoice没有访问用户OSS的权限。
## 解决方案配置RAM权限
### 1. 创建RAM角色
在阿里云RAM控制台创建角色允许CosyVoice服务访问OSS
```json
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:HeadObject"
],
"Resource": [
"acs:oss:*:*:{bucket-name}/*"
]
}
]
}
```
**参数说明:**
- `{bucket-name}`替换为你的OSS存储桶名称
### 2. 配置信任策略
为RAM角色添加信任策略允许DashScope服务扮演该角色
```json
{
"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` 中添加:
```yaml
yudao:
cosyvoice:
# ... 其他配置
# RAM角色ARN用于授权CosyVoice访问OSS
ram-role-arn: "acs:ram::{AccountID}:role/CosyVoice-OSS-Role"
```
### 5. 修改OSS访问方式
`CosyVoiceClient.buildClonePayload()` 中,添加授权信息:
```java
// 在请求头中添加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代码
```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
## 参考资料
- [阿里云RAM权限管理](https://help.aliyun.com/zh/ram/instance/role/parameter-overview)
- [STS临时凭证](https://help.aliyun.com/zh/acs/STS/usage-scenarios/usage-scenarios)
- [CosyVoice错误代码](https://help.aliyun.com/zh/model-studio/error-code#error-url)