package com.rj.service.impl;

import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Service
public class CosyVoiceServiceImpl {

    // Xinference集群地址和模型ID（替换为你的实际信息）
    private static final String XINFERENCE_URL = "http://192.168.1.39:9997/v1/audio/speech";
    private static final String MODEL_UID = "cosyvoice2-0.5b"; // 模型部署时的UID或名称

    private final RestTemplate restTemplate;

    // 注入RestTemplate
    public CosyVoiceServiceImpl(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    /**
     * 调用CosyVoice2生成语音
     * @param text 待转换的文本
     * @param outputPath 音频保存路径（如"output.wav"）
     * @return 是否成功
     */
    public boolean generateSpeech(String text, String outputPath) {
        try {
            // 1. 构造请求体
            Map<String, Object> requestBody = new HashMap<>();
            requestBody.put("model", MODEL_UID); // 模型ID
            requestBody.put("input", text);      // 输入文本
            // 可选参数：调整语音风格、语速等（根据模型支持的参数添加）
            requestBody.put("voice", "default"); // 语音风格（默认值）
            requestBody.put("speed", 1.0);       // 语速（1.0为正常）

            // 2. 设置请求头（JSON格式）
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);

            // 3. 发送POST请求
            HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, headers);
            ResponseEntity<byte[]> response = restTemplate.postForEntity(
                XINFERENCE_URL,
                request,
                byte[].class
            );

            // 4. 处理响应（保存音频文件）
            if (response.getStatusCode() == HttpStatus.OK) {
                byte[] audioData = response.getBody();
                if (audioData != null) {
                    try (FileOutputStream fos = new FileOutputStream(new File(outputPath))) {
                        fos.write(audioData);
                        return true;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
}