이번 강의에서는 Flutter 앱에서 키워드를 입력받아 Firestore에 저장한 후, FastAPI 서버에서 해당 키워드를 기반으로 OpenAI API를 호출하여 음악을 생성하는 과정을 다룹니다.
이 단계는 이전 강의에서 구현한 내용입니다. 사용자가 키워드를 입력하면 Firestore의 keywords 컬렉션에 keyword와 status 필드가 포함된 새 문서가 생성됩니다.
keyword: 사용자가 입력한 키워드status: 기본값은 "pending"으로 설정하여 음악 생성 진행 상태를 표시이후, Firestore에서 데이터가 업데이트될 때 FastAPI 서버가 이를 감지하여 음악 생성을 시작합니다.
Firebase Admin SDK를 통한 Firestore 접근
FastAPI 서버 코드 구성
FastAPI 서버를 실행한 후, 일정 주기로 Firestore의 keywords 컬렉션을 확인하여 status가 "pending"인 문서가 있는지 확인합니다.
아래는 Firestore의 keywords 컬렉션을 모니터링하여 새로운 키워드를 가져오는 예제 코드입니다.
from fastapi import FastAPI
from firebase_admin import credentials, firestore, initialize_app
import openai
import os
app = FastAPI()
# Firebase 초기화
cred = credentials.Certificate("path/to/serviceAccountKey.json")
initialize_app(cred)
db = firestore.client()
# OpenAI API 키 설정
openai.api_key = os.getenv("OPENAI_API_KEY")
@app.get("/generate-music")
async def generate_music():
# Firestore에서 'pending' 상태의 키워드를 가져옴
keywords_ref = db.collection("keywords").where("status", "==", "pending").stream()
for doc in keywords_ref:
data = doc.to_dict()
keyword = data["keyword"]
doc_id = doc.id
# OpenAI API를 사용하여 음악 생성
music_url = await create_music_with_openai(keyword)
# Firestore에 음악 URL과 상태 업데이트
db.collection("keywords").document(doc_id).update({
"fileUrl": music_url,
"status": "generated"
})
return {"message": "Music generation completed."}
OpenAI API를 통한 음악 생성 함수
create_music_with_openai 함수에서 키워드를 기반으로 OpenAI API에 음악 생성을 요청하고, 생성된 파일을 Firebase Storage에 업로드합니다.
아래는 키워드에 기반한 음악 생성 함수의 예제 코드입니다. OpenAI API에 요청을 보낸 후, 생성된 음악 데이터를 파일로 저장하고, Firebase Storage에 업로드합니다.
import openai
from google.cloud import storage
async def create_music_with_openai(keyword):
response = openai.Completion.create(
engine="text-davinci-003",
prompt=f"Create a musical piece inspired by the word: {keyword}",
max_tokens=100 # 설정된 토큰 수에 따라 길이가 달라짐
)
# 임시 파일로 저장 후 Firebase Storage에 업로드
music_data = response.choices[0].text
temp_file_path = "/tmp/generated_music.mp3"
with open(temp_file_path, "wb") as music_file:
music_file.write(music_data.encode()) # 데이터 형식에 맞게 수정 필요
# Firebase Storage에 파일 업로드
storage_client = storage.Client()
bucket = storage_client.bucket("your-firebase-bucket-name")
blob = bucket.blob(f"music/{keyword}.mp3")
blob.upload_from_filename(temp_file_path)
# URL 반환
return blob.public_url
create_music_with_openai 함수는 keyword를 기반으로 OpenAI API에 요청하여 음악 데이터를 생성하고, 임시 파일로 저장한 후 Firebase Storage에 업로드합니다. 업로드가 완료되면 공개 URL을 반환합니다.
FastAPI 서버 실행
uvicorn을 통해 실행합니다.uvicorn main:app --reload음악 생성 API 테스트
/generate-music 엔드포인트에 접근하여 음악 생성 프로세스를 실행합니다.status가 "pending"인 키워드가 확인되면 OpenAI API로 음악 생성이 시작되고, status가 "generated"로 업데이트되면서 fileUrl이 추가됩니다.다음 강의에서는 Flutter에서 생성된 음악 확인 및 다운로드 기능을 구현하여 사용자가 Firebase Storage에 저장된 음악을 재생하고 다운로드할 수 있도록 하겠습니다.