44 lines
1.4 KiB
Go
44 lines
1.4 KiB
Go
package oci
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/oracle/oci-go-sdk/v65/common"
|
|
)
|
|
|
|
// compatSpeechLimit 限制 TTS 音频响应体大小(长文本 mp3 给足余量)。
|
|
const compatSpeechLimit = int64(64 << 20)
|
|
|
|
// GenAiCompatSpeech 实现 Client:把 OpenAI Audio Speech 请求体直通到 OCI
|
|
// 兼容面 `/openai/v1/audio/speech`(IAM 签名,BasePath 置空——该面与
|
|
// /20231130/actions 面并存,实测仅前者承载 TTS)。返回音频字节与 Content-Type。
|
|
func (c *RealClient) GenAiCompatSpeech(ctx context.Context, cred Credentials, region string, body []byte) ([]byte, string, error) {
|
|
ic, err := c.genAiInferenceClient(cred, region)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
client := ic.BaseClient
|
|
common.UpdateEndpointTemplateForOptions(&client)
|
|
common.SetMissingTemplateParams(&client)
|
|
client.BasePath = ""
|
|
request, err := http.NewRequestWithContext(ctx, http.MethodPost, "/openai/v1/audio/speech", bytes.NewReader(body))
|
|
if err != nil {
|
|
return nil, "", fmt.Errorf("build compat speech request: %w", err)
|
|
}
|
|
request.Header.Set("Content-Type", "application/json")
|
|
request.Header.Set("opc-compartment-id", cred.TenancyOCID)
|
|
response, err := client.Call(ctx, request)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
defer response.Body.Close()
|
|
payload, err := readCompatBody(response.Body, compatSpeechLimit, "compat speech")
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
return payload, response.Header.Get("Content-Type"), nil
|
|
}
|