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

157 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)