사용자 입력 처리 및 음악 생성 요청

CHAN·2024년 11월 3일

FastAPI

목록 보기
3/9

3강: 사용자 입력 처리 및 음악 생성 요청

이번 강의에서는 Flutter 앱에서 키워드를 입력받아 Firestore에 저장한 후, FastAPI 서버에서 해당 키워드를 기반으로 OpenAI API를 호출하여 음악을 생성하는 과정을 다룹니다.


1. Flutter에서 키워드를 입력받아 Firestore에 저장하기

이 단계는 이전 강의에서 구현한 내용입니다. 사용자가 키워드를 입력하면 Firestore의 keywords 컬렉션에 keywordstatus 필드가 포함된 새 문서가 생성됩니다.

  • keyword: 사용자가 입력한 키워드
  • status: 기본값은 "pending"으로 설정하여 음악 생성 진행 상태를 표시

이후, Firestore에서 데이터가 업데이트될 때 FastAPI 서버가 이를 감지하여 음악 생성을 시작합니다.


2. FastAPI 서버에서 Firestore 데이터 수신

  1. Firebase Admin SDK를 통한 Firestore 접근

    • FastAPI 서버에서 Firebase Firestore를 모니터링하고, 새로운 키워드가 추가되면 이를 수신하여 OpenAI API를 통해 음악을 생성하도록 합니다.
    • Firebase Admin SDK를 설정하고 FastAPI 서버에서 Firestore를 읽어올 수 있게 구성합니다.
  2. 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."}
  3. 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을 반환합니다.


3. FastAPI 서버 실행 및 테스트

  1. FastAPI 서버 실행

    • FastAPI 서버를 uvicorn을 통해 실행합니다.
      uvicorn main:app --reload
  2. 음악 생성 API 테스트

    • 브라우저나 Postman 등 API 테스트 도구를 통해 /generate-music 엔드포인트에 접근하여 음악 생성 프로세스를 실행합니다.
    • Firestore에서 status"pending"인 키워드가 확인되면 OpenAI API로 음악 생성이 시작되고, status"generated"로 업데이트되면서 fileUrl이 추가됩니다.

이번 강의 요약

  • Flutter 앱에서 사용자가 입력한 키워드를 Firestore에 저장하는 기능을 재확인했습니다.
  • FastAPI 서버에서 Firestore를 모니터링하고, 새로운 키워드에 따라 OpenAI API로 음악을 생성하여 Firebase Storage에 저장했습니다.
  • Firestore 데이터가 업데이트되어 Flutter 앱에서 생성된 음악을 확인할 수 있는 상태로 변경되었습니다.

다음 강의에서는 Flutter에서 생성된 음악 확인 및 다운로드 기능을 구현하여 사용자가 Firebase Storage에 저장된 음악을 재생하고 다운로드할 수 있도록 하겠습니다.

profile
프로그래머

0개의 댓글