연구실 과제/Dalle3

톰켓에서 google tts api사용하기

dongok218 2025. 2. 6. 23:03

✅ 1. 개요

Tomcat은 기본적으로 Java 기반의 서블릿 컨테이너이므로, Python 기반의 Flask를 직접 실행할 수 없습니다.
그러므로 Flask 서버를 독립적으로 실행하고, Tomcat에서 이를 API로 호출하는 방식을 사용해야 합니다.

구성:

  1. Flask (server.py): Google TTS API를 처리하고 오디오 파일을 생성하는 역할
  2. Tomcat (index.jsp 또는 Spring Boot): Flask의 REST API를 호출하고 웹사이트에서 사용할 수 있도록 처리
  3. HTML/JavaScript: 사용자가 텍스트 입력 후, Flask의 TTS API를 호출하고 응답 받은 음성을 재생

[server.py] ▶ flask서버 실행시킴 + google TTS API로 오디오 생성

import os
from flask import Flask, request, send_file, jsonify
from google.cloud import texttospeech

app = Flask(__name__)

# Google TTS API 인증 설정
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/opt/dilabtts-da637c7e3b0e.json"

# Tomcat에서 사용할 MP3 저장 경로
TOMCAT_AUDIO_FOLDER = "/usr/local/apache-tomcat-10.1.28/webapps/Dalle3Site/resources/generateAudios"

# Tomcat 폴더가 존재하지 않으면 생성
os.makedirs(TOMCAT_AUDIO_FOLDER, exist_ok=True)

@app.route('/api/tts', methods=['POST'])
def generate_tts():
    data = request.get_json()
    text = data.get("text")

    if not text:
        return jsonify({"error": "No text provided"}), 400

    synthesis_input = texttospeech.SynthesisInput(text=text)
    voice = texttospeech.VoiceSelectionParams(
        language_code="ko-KR",
        ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL
    )
    audio_config = texttospeech.AudioConfig(
        audio_encoding=texttospeech.AudioEncoding.MP3  # MP3 변환
    )

    client = texttospeech.TextToSpeechClient()
    response = client.synthesize_speech(
        input=synthesis_input,
        voice=voice,
        audio_config=audio_config
    )

    # 🎯 파일명을 고유하게 생성 (파일이 덮어씌워지는 걸 방지)
    filename = "tts_output.mp3"
    output_path = os.path.join(TOMCAT_AUDIO_FOLDER, filename)

    with open(output_path, "wb") as out_file:
        out_file.write(response.audio_content)

    return jsonify({
        "message": "MP3 file generated successfully!",
        "file_path": f"/Dalle3Site/resources/generateAudios/{filename}"
    }), 200

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5002, debug=True)

 

[makeAudio.jsp] ▶ 웹사이트에서 텍스트를 입력받아 flask서버에 넘김.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Google TTS API (MP3)</title>
</head>
<body>
    <h2>Google TTS API 테스트 (MP3 변환)</h2>
    <form method="post">
        <input type="text" name="text" placeholder="여기에 텍스트 입력">
        <input type="submit" value="음성 변환">
    </form>
    <audio controls>
        <source src="output.mp3" type="audio/mpeg">
    </audio>

    <%
        if (request.getMethod().equals("POST")) {
            String text = request.getParameter("text");
            if (text != null && !text.isEmpty()) {
                String flaskUrl = "http://127.0.0.1:5002/api/tts";
                java.net.URL url = new java.net.URL(flaskUrl);
                java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "application/json");
                conn.setDoOutput(true);

                java.io.OutputStream os = conn.getOutputStream();
                os.write(("{\"text\":\"" + text + "\"}").getBytes("UTF-8"));
                os.flush();
                os.close();

                java.io.InputStream inputStream = conn.getInputStream();
                java.nio.file.Files.copy(inputStream, new java.io.File("output.mp3").toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
                inputStream.close();
            }
        }
    %>
</body>
</html>

 


<모르는 코드 공부>

<파이썬 부분>

  1. app = Flask(__name__)
    • Flask(__name__)는 Flask 웹 애플리케이션을 생성하는 코드.
    • __name__은 현재 실행중인 Python 모듈의 이름을 의미하며, Flask가 해당 모듈의 위치를 인식할 수 있도록한다.
    • Flask는 라우팅(ex: /api/tts)을 설정하고 HTTP 요청을 처리하기 위한 웹 서버 프레임워크이다.
    • app객체를 통해 Flask 서버를 실행하고, 엔드포인트(API)를 정의할 수 있다.
  2.  os.environ
    • 운영체제 환경변수를 설정하거나 읽는 코드.
    • os.environ은 Python에서 운영체제의 환경변수를 설정하거나 가져올때 사용한다.
    • "GOOGLE_APPLICATION_CREDENTIALS"환경변수를 설정하여, Google Cloud TTS API를 사용하기 위한 인증 정보를 제공하는 역할을 한다.
    • os.environ["GOOGLE_APPLICATION_CREDENTIALS"]를 설정하면, Google의 TTS API 클라이언트(texttospeech.TextToSpeechClient())가 해당 JSON 키 파일을 자동으로 참조하여 인증된다.
  3. with open(output_path, "wb") as out_file:
    • output_path 경로에 파일을 '쓰기모드'로 열고 바이너리(b)모드로 데이터를 저장하는 코드
  4.  app.run(host="0.0.0.0", port=5002, debug=True)
    • Flask서버를 실행하는 코드
    • host="0.0.0.0" ▶ Flask서버가 모든 네트워크 인터페이스에서 요청을 받을 수 있도록 설정. 127.0.0.1로하면 로컬에서만 가능.
    • port=5002 ▶ Flask서버가 5002번 포트에서 실행되도록 설정. 기본값은 5000이지만 변경했음.
    • debug=True ▶ Flask의 디버그모드를 활성화하여 코드 변경시 자동으로 서버를 다시 실행(핫 리로드)
    • 에러 발생시 상세 디버깅정보 출력,

 

<jsp부분>

if (request.getMethod().equals("POST")) {  // 1️⃣ 클라이언트가 POST 요청을 보냈는지 확인
    String text = request.getParameter("text");  // 2️⃣ 사용자가 입력한 텍스트 가져오기

    if (text != null && !text.isEmpty()) {  // 3️⃣ 입력된 텍스트가 비어있지 않은지 확인
        String flaskUrl = "http://127.0.0.1:5002/api/tts";  // 4️⃣ Flask API URL 설정

        java.net.URL url = new java.net.URL(flaskUrl);  // 5️⃣ Flask 서버의 URL 객체 생성
        java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();  // 6️⃣ HTTP 연결 생성

        conn.setRequestMethod("POST");  // 7️⃣ HTTP 요청 방식: POST
        conn.setRequestProperty("Content-Type", "application/json");  // 8️⃣ 요청 헤더에 "Content-Type: application/json" 설정
        conn.setDoOutput(true);  // 9️⃣ 출력 스트림을 활성화 (POST 요청 시 필요)

        java.io.OutputStream os = conn.getOutputStream();  //  🔟 Flask API로 데이터를 전송할 OutputStream 생성
        os.write(("{\"text\":\"" + text + "\"}").getBytes("UTF-8"));  // 1️⃣1️⃣ JSON 형식으로 변환 후 전송
        os.flush();  // 1️⃣2️⃣ 스트림을 비워 전송 완료
        os.close();  // 1️⃣3️⃣ 스트림 닫기

        java.io.InputStream inputStream = conn.getInputStream();  // 1️⃣4️⃣ Flask API 응답을 받기 위한 InputStream 생성
        java.nio.file.Files.copy(inputStream, new java.io.File("output.mp3").toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);  // 1️⃣5️⃣ 응답 데이터를 "output.mp3"로 저장
        inputStream.close();  // 1️⃣6️⃣ 스트림 닫기
    }
}