본문 바로가기

졸업 프로젝트

mp3 파일 다루기 - S3 업로드&객체 가져오기 (1)

문제..?는 아니지만 프로젝트에서 mp3 파일을 다루는 것에 대해 의견차이가 생겼다.

일단 GoogleTTS를 사용해서 텍스트를 Voice Information으로 바꾸기까지는 성공했다.

이것을 위해 모델도 좀 바꿔줬다...댓글 작성자의 voice information을 프론트로 넘기도록! 

 

댓글 하나를 변환하거나, voice 정보를 수정할 때는 따로 저장을 하지 않아도 된다.

하지만 댓글 모두를 모아듣는 것은 저장을 한 후 들려주기를 원한다. 여기에 가능하면 배경음악까지..?

아마 외부 라이브러리를 추가로 설치해야 하고...저장은 s3를 연결해서 따로 수행해야 할 것 같다..ㅜ 가능할까??

 


# S3 버킷 + 유저 설정

일단 mp3파일을 저장할 S3 버킷을 생성한다.

버킷은 이미지파일 다룰 때 만들었던 것이 있으므로 안에 따로 mp3 폴더를 생성했다.

이미지도...따로 정리해야할듯..ㅎ

s3에 접근 가능한 유저를 생성한다.

지금 로그인 되어있는 루트 계정은 위험하니까..서브 계정을 만들고 그 계정의 ID와 Secret Key를 이용하여 프로그램에 추가 후 s3에 접근할 것이다.

 

사용자 생성하기. 프로그램에서 사용할 사용자이므로 IAM 사용자를 생성한다.

 

권한 설정을 한 그룹에 사용자를 넣어야 한다.

만든게 없으므로 그룹 생성하기

 

직관적인 그룹이름이다.

권한 정책은 S3FullAcceess로.

 

이제 다음을 누르고 사용자를 생성한다.

 

로그인할 일이 있으면 .csv파일을 다운로드 한다.


# Django 업로드 준비하기

 

먼저 가상환경에 boto3와 django-storages를 설치한다.

참고로 boto3는 AWS에 제공하는 SDK로, python과 AWS를 연결하기 위해 사용한다.

그리고 settings.py에 관련 설정해주기.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
    'storages',

    'rest_framework',
    'rest_framework_simplejwt',
    "django_filters",

    "accounts",
    "posts",
]

# S3 Storages
AWS_ACCESS_KEY_ID = '.csv 파일에 있는 Access Key Id'
AWS_SECRET_ACCESS_KEY = '.csv 파일에 있는 Secret Access Key'
AWS_REGION = 'ap-northeast-2'

AWS_STORAGE_BUCKET_NAME = 'codecamper-blog-bucket'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME, AWS_REGION)
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

엑세스 키는 여기서 생성 후 .csv 파일을 다운받아서 확인한다.

 

먼저 로컬에서 S3로 mp3파일을 업로드하기 위한 코드를 작성한다.

class Mp3Upload(APIView):
    # 댓글 전체 조회
    def post(self, request, post_pk, format=None):
        # Google TTS 처리 -> 임시 댓글 작성자한테 받아와야 하는뎁..
        client = texttospeech.TextToSpeechClient()
        synthesis_input = texttospeech.SynthesisInput(text="안녕하세요")
        voice = texttospeech.VoiceSelectionParams(
            language_code="ko-KR", name="ko-KR-Wavenet-D"
        )
        audio_config = texttospeech.AudioConfig(
            audio_encoding=texttospeech.AudioEncoding.MP3,
            pitch=0, # 0, -20.0~20.0 사이만 가능
            speaking_rate=1 # 1, 0.25~4.0 사이만 가능
        )

        response = client.synthesize_speech(
            input=synthesis_input,
            voice=voice,
            audio_config=audio_config
        )
        s3_client = boto3.client(
            's3',
            aws_access_key_id=ACCESS_KEY_ID,
            aws_secret_access_key=SECRET_ACCESS_KEY
        )

        s3_client.put_object(Body=response.audio_content, Bucket=AWS_STORAGE_BUCKET_NAME, Key="mp3/a1"+".mp3")
        
        return Response({"RESULT": comment_list}, status=200)
  • 일단 voice를 만드는 코드에 값에 임시로 상수 설정함.
  • 나중에 comment를 가져와서 author의 voice_info와 text를 바탕으로 변수를 넣어줄 예정이다.
  • s3에 업로드를 위해서..s3_client라는 이름의 boto3를 이용한 객체를 만든다. key는 settings에서 적은 것처럼 가져오면 된다. 나중에 .env에 업로드할 예정임.
  • 만들어진 s3 client에 put_object()를 이용하여 파일을 업로드(수정)한다. 내가 만드는 프로젝트는 파일이 계속 수정될 것이므로...put을 이용함.
  • Body에는 업로드할 audio파일 객체, Bucket에는 Bucket이름을 넣는다.
  • Key에는 업로드할 파일 명을 입력하면 된다. 만약 Bucket에 따로 폴더를 나누고 싶거나 나눴다면 여기다가 디렉토리를 적어준다.
  • 마지막으로 올릴 파일의 타입까지 적어주면 완성!

 

이제 s3에 올라간 객체를 가져와야 한다.

    def get(self, request, post_pk, format=None):
        s3_client = boto3.client(
            's3',
            aws_access_key_id=ACCESS_KEY_ID,
            aws_secret_access_key=SECRET_ACCESS_KEY
        )

        mp3_list = s3_client.list_objects(Bucket=AWS_STORAGE_BUCKET_NAME)
        content_list = mp3_list['Contents']
        # url = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/mp3/a1.mp3' # 이렇게 url 가져오기
        return Response({"RESULT": content_list}, status=200)

이런식으로..가져와진다. 사실 내가 필요한 부분은 Key(파일명)이다.

파일명을 이용해서 url을 return할 것이기 때문!

 

 

오래 걸렸다

파일의 URL로 들어가면 MP3 파일이 다운받아진다.

 

 


# 회고

 

너무너무너무 어렵다....ㅜㅜㅜ

일단 가장 중요한 S3와 내 프로젝트를 연동하기..는 성공했으니 어떻게 파일을 올릴지 고민이다.

 

생각해둔 것은 

1. 모든 음성파일 합쳐서 올리기 

  • 게시글 하나에 달린 모든 댓글의 음성파일들을 서버에서 합친 후 s3에 올리는 방식이다.
  • 내가 직접 댓글 text와 voice정보 가져와서 반복해서 계속 음성 바꿔주고...저장하고..이걸 반복해야 한다. 어려워서 될지는?
  • 대신 s3 폴더 관리는 쉬울 듯 하다. 그냥 게시글 제목이나 uuid로 폴더를 따로 생성하지 않고 음성 파일로 바로 올릴듯(아님 mp3폴더로 따로 관리하거나)
  • 프론트에서 배경음악도...원하는데...그러면 이게 더 쉬울 것 같긴 함.

2. 음성파일 각각 올리기

  • 게시글 하나의 폴더를 생성 후 그 안에 각 댓글의 음성 파일을 올리는 것이다.
  • 솔직히 이게 백 입장에서는 쉬운데..프론트에서 알아서 잘 음성 파일 여러개를 출력해야지.
  • 배경음악 할거면 어짜피 이것도 합쳐야 하는데...그래서

아님 1+2로 둘다 올리거나...모르겠다.

 

아 어려워요