카테고리 없음

노래를 텍스트 화 시도해보기_1차시도_코드작성(2)

수닝이 2024. 2. 10. 02:28

1. mp3파일을 wav파일로 변환

https://convertio.co/kr/mp3-wav/

 

MP3 WAV 변환 (온라인 무료) — Convertio

mp3 파일(들) 업로드 컴퓨터, Google Drive, Dropbox, URL에서 선택하거나 이 페이지에서 드래그하여 선택해 주세요.

convertio.co

여기서 했습니다.

노래는 악동뮤지션에 Galaxy로 진행했습니다.(하나에 올릴 수 있는 파일용량이 초과되어 노래파일은 업로드하지 못했습니다ㅠㅠ + 악동뮤지션 노래좋아요...!)

2. 분과 초 전부 알 때 사용

def division(mins,sec,div):
    time = (mins*60+sec) / div
    return time

mins = 2
sec = 59
div = 10
print(f'{mins} {sec}초를 {div}초로 나눌 때 {division(mins,sec,div)}이다.')
 
[output]

2분 59초를 10초로 나눌 때 17.9이다. -> 18구간으로 나눈다.

 

3. 텍스트 파일에 파일이름을 저장 및 음성 파일을 10초씩 나누기

import soundfile as sf  # 추가된 import 문
import os
import librosa

import numpy as np

cap = 18 # 구간 지정
def trim_audio_data(audio_file, save_file): 텍스트에 파일이름을 저장한다.
    sec = 10 # 10초로 지정
    with open('each_10sec.txt', 'w', encoding='utf-8') as f:
        for k in range(0,cap):
            data, sr = librosa.load(audio_file) # 파일을 불러와서 데이터와 샘플레이트값을 구한다.
            data_10 = data[sr*(sec*k):sr*(sec*(k+1))]  # 0~10까지 10~20까지 이렇게 진행되게 한다.
            sf.write(save_file+ f'_{k}' + '.wav', data_10, sr) # 파일저장
            f.write(f"{save_file}_{k}\n") # 텍스트파일에 이름 저장

텍스트 파일에 파일이름을 저장하고 10초씩 나눠서 파일 저장하는 함수를 만든다.

 

* 10초씩 자른 파일들의 경로를 저장한 텍스트 파일입니다. 

each_10sec.txt
0.00MB

 

 

4. 오디오 불러오기 및 함수에 넣어 자르기 작업

audio_path = "오디오 경로"
save_path = '파일 저장할 경로'
audio_list = os.listdir(audio_path)


for audio_name in audio_list:
    if audio_name.endswith('.wav'):  # 파일이 .wav인지 확인
        audio_file = os.path.join(audio_path, audio_name) # 오디오 파일 불러오기
        save_file = os.path.join(save_path, audio_name[:-4]) # 2
        trim_audio_data(audio_file, save_file)

 save_file = os.path.join(save_path, audio_name[:-4])부분에서 save_path에는 저장할 폴더의 경로가 저장되어 있고, audio_name[:-4]는 파일 이름에서 확장자를 제외한 부분을 나타냅니다. 두 부분을 합해서 분할된 오디오 파일을 저장할 경로를 만드는 부분입니다.

 

* 10초씩 잘라서 저장한 파일입니다. 

output_each_10sec.zip
7.22MB

5. api키 정의 및 언어설정

# API 엔드포인트 및 액세스 키 설정
accessKey = "각자 받은 api"

# 언어 코드 설정
languageCode = "korean" # 한국어로 사용(원하는 데이터에 맞게 언어 바꾸기)

 

6. txt파일 -> csv파일로 바꾸기

6-1. text파일에 name 추가 및 확인

import pandas as pd
 
# 텍스트 파일 읽기
with open('each_10sec.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()

# 데이터프레임 생성
data = {'name': lines}
file_name_csv = pd.DataFrame(data)

# CSV 파일로 저장
df.to_csv('each_10sec.csv', index=False)

 

* text파일 -> csv로 변환한 것

each_10sec.csv
0.00MB

 

7. 10초 씩 자른 파일들 텍스트화 시키는 코드

import base64
import urllib3
import json
 
N = len(file_name_csv)
for i in range(N):
    # WAV 파일 경로 및 언어 코드 설정
   
    audioFilePath = file_name_csv['name'][i][:-1]+'.wav'
    languageCode = "korean"

    # WAV 파일을 base64로 인코딩
    with open(audioFilePath, "rb") as file:
        audioContents = base64.b64encode(file.read()).decode("utf-8")

    # HTTP 요청 헤더 및 본문 설정
    headers = {
        "Authorization": accessKey,
        "Content-Type": "application/json; charset=UTF-8"
    }

    requestJson = {
        "argument": {
            "language_code": languageCode,
            "audio": audioContents
        }
    }

    # HTTP 요청 보내기
    http = urllib3.PoolManager()
    response = http.request(
        "POST",
        openApiURL,
        headers=headers,
        body=json.dumps(requestJson)
    )

    # 응답 확인
    print("[responseCode] " + str(response.status))
    print("[responBody]")

    print("===== 결과 확인 ====")
    data = json.loads(response.data.decode("utf-8", errors='ignore'))
   
    # 텍스트를 text_change파일에 text형식으로 쓰기
    with open('galaxy_each_15minute.txt', 'w', encoding='utf-8') as f:
        f.write(data['return_object']['recognized'])    
       
    print(data['return_object']['recognized'])

[output]

[responseCode] 200
[responBody]
===== 결과 확인 ====
교육 확실해.
[responseCode] 200
[responBody]
===== 결과 확인 ====
그 역시 그 역시도 혹시나
[responseCode] 200
[responBody]
===== 결과 확인 ====
와 같이 걸어가 볼래 반짝이는 은아 너무 손잡고 나와 같이 걸어가 볼래
[responseCode] 200
[responBody]
===== 결과 확인 ====
누가 살고 있나 아무도 몰라 그 너 뭐 있는지 누구도 몰라 다만 꿈
[responseCode] 200
[responBody]
===== 결과 확인 ====
명이 하려 한 무지개 너머 내 꿈 둥둥 떠나낼 거예요 TOP TOP
[responseCode] 200
[responBody]
===== 결과 확인 ====
HAPOP WHOP WEANE WHODE YEANE YEAHEY YOU YEYEANE YEYEANE YEYEANE YEANE YEANE YE YEANE YEANE YEANE YEYE YOU
[responseCode] 200
[responBody]
===== 결과 확인 ====
하지 못한 내 고백 기저 하늘 이미 아기 반짝이고 있는 그날 수로 흘러갔을까 그
[responseCode] 200
[responBody]
===== 결과 확인 ====
뚜뚜 뚜뚜 뚜 뚜 뚜 뚜 뚜 뚜 뚜 뚜 뚜
[responseCode] 200
[responBody]
===== 결과 확인 ====
뚜뚜 뚜 뚜 뚜 뚜 뚜 뚜 뚜 그 없이도 없이 나와 같이
[responseCode] 200
[responBody]
===== 결과 확인 ====
이 날아 타 볼래 반짝이는 팅커벨의 가루가 너와 나를 비워 줄 거야 네
[responseCode] 200
[responBody]
===== 결과 확인 ====
누가 숨어 우리를 볼지도 몰라 널 위한 축제가 있을지도 몰라 다만 분명히 너
[responseCode] 200
[responBody]
===== 결과 확인 ====
너무 난 무난 게 너만 내 꿈둥둥 떠다닐 거예요 Tot to to to to tho tho tho tho tho the tho thero
[responseCode] 200
[responBody]
===== 결과 확인 ====
가 어디야 할까 말까 고민 끝에 한겨울 밤 몰래 간 도둑 눈의 숨이 멎어 도망가 버린
[responseCode] 200
[responBody]
===== 결과 확인 ====
오백 마디 저 하늘 이미 아기 반짝이고 있는 은하수로 흘러갔을까
[responseCode] 200
[responBody]
===== 결과 확인 ====
에 혹시 넌 혹시 나와 같이 걸어가 볼래
[responseCode] 200
[responBody]
===== 결과 확인 ====
반짝이는 은어 너무 숨잡고 나와 같이 걸어가 볼래 갤럭시 나
[responseCode] 200
[responBody]
===== 결과 확인 ====
혹시 나와 같이 나 같아 볼래 반짝이는 핑커맨 하루가 너와 나
[responseCode] 200
[responBody]
===== 결과 확인 ====
을 띄워 줄 거야

앞 게시물에서도 이야기했듯이 아직 수정할 부분이 많습니다. 맞는 가사도 있지만 맞지 않는 가사도 많아서 아직 수정이 많이 필요합니다. 나머지는 조금 더 찾아보고 공부해야겠네요ㅎㅎ