AWS Polly 및 Python을 사용하여 긴 텍스트 파일을 음성으로 변환

10734 단어 pythonaws
저는 최근published a Python package 텍스트 파일을 수집하고 AWS Polly를 사용하여 해당 텍스트의 TTS(텍스트 음성 변환) 렌더링을 생성합니다. 문제의 일부는 생성된 각 녹음에 대한 문자 제한이 있으므로 긴 문자열을 250자 청크로 자르면 작동할 수 있지만 단어가 분리될 위험이 있고 오디오 청크가 다시 조합될 때 이 경계를 넘어 들리면 "tuh"와 "he"와 같은 단어가 됩니다. 이 패키지는 이러한 종류의 동작을 처리하고 필요에 따라 다듬기 위해 부분적으로 작성되었습니다(균일하게 분할하기 보다는 더 짧고 더 긴 청크를 생성할 수 있음).

패키지를 설치한 후:

pip3 install polly-textfile-cli


다음과 같이 실행합니다.

polly-textfile --path input.txt --name output-name


패키지 내에서 텍스트 파일은 목록으로 개별 단어로 나뉩니다.

def fileChunkList(filePath, limit):
    with open(filePath, 'r') as file:
        data = file.read().replace('\n','')
    #lines = [data[i:i+limit] for i in range(0, len(data), limit)]
    lines_in = data.split(" ")
    lines = constructSentences(lines_in,limit)
    return lines


그런 다음 lines = constructSentences(lines_in,limit)는 Polly가 오디오로 렌더링할 각 세그먼트를 재구성하는 데 사용됩니다.

def constructSentences(words,limit):
    ss = []
    s = []
    for w in words:
        if len(w) + len(" ".join(s)) <= limit:
            s.append(w)
        else:
            sentence = " ".join(s)
            ss.append(sentence)
            s = []
            s.append(w)
    return ss


따라서 limit가 250이면 "문장"(최대 길이가 limit인 문자열)에 새 단어를 추가하기 전에 길이가 초과되는지 확인하고 초과되면 문장이 추가됩니다. 목록, 그리고 새로운 것이 시작되었습니다. 이것은 linesfileChunkList() 목록으로, 다음 함수에서 생성된 녹음에 대한 텍스트 스크립트가 됩니다.

def createChunkAudio(id, linesList):
    parts = len(linesList)
    partsIdList = []
    for i in range(1, parts):
        resp = streamAudio(linesList[i-1])
        stream = resp['AudioStream']._raw_stream
        with FileIO("%s-part-%s.mp3" % (id,i), 'w') as file:
            for i in stream:
                file.write(i)
            partsIdList.append(file.name)
    return partsIdList


여기서 lines 목록의 최대 길이 250개 항목에 대해 위 루프의 ${whatever-output-name}-part-1.mp3 함수에 전달하여 mp3 파일이 생성됩니다(즉, streamAudio() ). 오디오 스트림을 생성하기 위해 Polly에 전화를 끊습니다.

def streamAudio(inString):
    polly = client("polly", "us-east-2")
    response = polly.synthesize_speech(
        Text=inString,
        OutputFormat="mp3",
        VoiceId="Matthew")
    return response


이 시점에서 예를 들어 output-part-1.mp3 , output-part-2.mp3output-part-3.mp3 와 같은 mp3 파일과 같이 3개의 세그먼트로 분할해야 하는 텍스트 파일에 대해 생성했습니다. 이는 그다지 편리하지 않으므로 마지막 단계는 위의 함수에서 만든 오디오 청크의 경로 목록을 사용하여 이들을 결합합니다.

def concatPartsAudio(pathList, id):
    print(pathList)
    cmdStr = "concat:"
    for p in pathList:
        if pathList[-1] == p:
            cmdStr = cmdStr + "%s" % (p)
        else:
            cmdStr = cmdStr + "%s|" % (p)
    print(cmdStr)
    concat = os.system("ffmpeg -i '%s' -acodec copy '%s.mp3'" % (cmdStr, id))
    s = os.system("stat %s.mp3" % (id))
    return s


이것은 선호하는 오디오 출력 설정에 따라 여러 가지 방법으로 수행할 수 있지만 가장 간단한 형식으로 각 파일을 output.mp3 에 연결합니다.

좋은 웹페이지 즐겨찾기