문제..?는 아니지만 프로젝트에서 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로 둘다 올리거나...모르겠다.
아 어려워요
'졸업 프로젝트' 카테고리의 다른 글
mp3 파일 다루기 - S3 업로드&객체 가져오기 (3) + 좋아요 기능 (0) | 2024.04.16 |
---|---|
mp3 파일 다루기 - S3 업로드&객체 가져오기 (2) (1) | 2024.04.10 |
이미지 파일 다루기(AWS S3 이용) (0) | 2024.03.28 |
Google Cloud TTS 이용하기 + 배포 오류 해결 (3) | 2024.03.18 |
Signal을 이용하여 Profile 자동 생성하기 + RDS 접속 (0) | 2024.03.12 |