✅ 1. 개요
Tomcat은 기본적으로 Java 기반의 서블릿 컨테이너이므로, Python 기반의 Flask를 직접 실행할 수 없습니다.
그러므로 Flask 서버를 독립적으로 실행하고, Tomcat에서 이를 API로 호출하는 방식을 사용해야 합니다.
구성:
- Flask (server.py): Google TTS API를 처리하고 오디오 파일을 생성하는 역할
- Tomcat (index.jsp 또는 Spring Boot): Flask의 REST API를 호출하고 웹사이트에서 사용할 수 있도록 처리
- 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>
<모르는 코드 공부>
<파이썬 부분>
- app = Flask(__name__)
- Flask(__name__)는 Flask 웹 애플리케이션을 생성하는 코드.
- __name__은 현재 실행중인 Python 모듈의 이름을 의미하며, Flask가 해당 모듈의 위치를 인식할 수 있도록한다.
- Flask는 라우팅(ex: /api/tts)을 설정하고 HTTP 요청을 처리하기 위한 웹 서버 프레임워크이다.
- app객체를 통해 Flask 서버를 실행하고, 엔드포인트(API)를 정의할 수 있다.
- os.environ
- 운영체제 환경변수를 설정하거나 읽는 코드.
- os.environ은 Python에서 운영체제의 환경변수를 설정하거나 가져올때 사용한다.
- "GOOGLE_APPLICATION_CREDENTIALS"환경변수를 설정하여, Google Cloud TTS API를 사용하기 위한 인증 정보를 제공하는 역할을 한다.
- os.environ["GOOGLE_APPLICATION_CREDENTIALS"]를 설정하면, Google의 TTS API 클라이언트(texttospeech.TextToSpeechClient())가 해당 JSON 키 파일을 자동으로 참조하여 인증된다.
- with open(output_path, "wb") as out_file:
- output_path 경로에 파일을 '쓰기모드'로 열고 바이너리(b)모드로 데이터를 저장하는 코드
- 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️⃣ 스트림 닫기
}
}
'연구실 과제 > Dalle3' 카테고리의 다른 글
Flask와 RESTFul API (0) | 2025.02.07 |
---|---|
톰켓에서 flask와 통신방식 (0) | 2025.02.06 |
Java기반 톰켓이서 파이썬파일 실행하는 방법 (1) | 2025.02.06 |
centos7에서 flask서버를 통해 google tts api사용 (0) | 2025.02.06 |
클라이언트와 서버측 코드 나누기 (0) | 2025.02.05 |