자막에서 오디오로, coqui-ai tts를 사용하여 모든 자막 파일에서 오디오/음성을 생성하고 자막 시간에 따라 오디오 타이밍을 동기화합니다.
데모 :
ffmpeg, pydub, librosa, coqui-ai tts, ffmpeg-python
pip install TTS
pip install git+https://github.com/bnsantoso/sub-to-audiopip install TTS
pip install subtoaudioLinux의 FFMPEG
apt-get install ffmpeg기본 사용은 Coqui-ai tts에 매우 유사하며 <lang-iso_code>의 문서를 확인할 수 있습니다.
! 참고 : 최상의 결과를 위해 초당 최적의 문자를 가진 비 겹치는 자막을 사용하십시오.
! 참고 : Aegisub와 같은 소프트웨어를 사용하여 자막을 편집하십시오
from subtoaudio import SubToAudio
# list all model
SubToAudio (). coqui_model ()
# get model index
model = SubToAudio (). coqui_model ()[ 1 ]
# The code will output 'yoursubtitle.wav' in the current directory.
sub = SubToAudio ( model_name = model )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle )
# you can choose 1100 different language using fairseq model
sub = SubToAudio ( fairseq_language = '<lang-iso_code>' )
subtitle = sub . subtitle ( "yoursubtitle.ass" )
sub . convert_to_audio ( sub_data = subtitle )
# specify model name
sub = SubToAudio ( model_name = "tts_models/multilingual/multi-dataset/your_tts" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , output_path = "subtitle.wav" )
# specify model and config path
sub = SubToAudio ( model_path = "path/to/your/model.pth" config_path = "config/path.json" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle )
# speaker=tts.speakers[0] or None if model doesnt have multiple speakers
# language=tts.languages[0] or None if doesnt have multiple languages
# list speaker
sub . speakers ()
speaker1 = sub . speakers ()[ 1 ]
# list languages
sub . languages ()
langu = sub . languages ()[ 0 ]
sub = SubToAudio ( model_name = "tts_models/multilingual/multi-dataset/your_tts" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , language = langu , speaker = speaker1 , output_path = "subtitle.wav" )
# Save temporary audio to current folder
sub = SubToAudio ( model_name = "tts_models/multilingual/multi-dataset/your_tts" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , output_path = "subtitle.wav" , save_temp = True ) 음성 변환 방법을 사용하려면 self.convert_to_audio 에서 voice_conversion:bool and speaker_wav:str paramater를 통과해야합니다. 모델에 여러 스피커가 있으면 음성 변환을 실행할 수 없습니다.
from subtoaudio import SubToAudio
sub = SubToAudio ( fairseq_language = "eng" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , voice_conversion = True , speaker_wav = "voice.wav" , language = "en" )Coqui Studio API를 사용하려면 Coqui_studio_token 환경 변수를 구성해야합니다.
import os
os . environ [ 'COQUI_STUDIO_TOKEN' ] = # yourapi 토큰 세트 후에는 Coqui Studio 모델을 얻을 수 있습니다.이 이름 컨벤션 coqui_studio/en/<studio_speaker_name>/coqui_studio 따를 수 있습니다.
from subtoaudio import SubToAudio
sub = SubToAudio ( model_name = "coqui_studio/en/Torcull Diarmuid/coqui_studio" , progress_bar = False )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , output_path = "subtitle.wav" , save_temp = True )
# use emotion paramater and speed paramater
sub . convert_to_audio ( sub_data = subtitle , output_path = "subtitle.wav" , emotion = "Happy" , speed = 1.5 ) tempo_mode 매개 변수를 사용하여 오디오 속도를 높이십시오. 세 가지 템포 모드가 있습니다.
tempo_mode="all" : 모든 오디오가 가속화합니다. 속도를 지정하려면 tempo_speed=float 사용하십시오.tempo_mode="overflow" : 다음 자막이 나타나기 전 총 자막 기간과 빈 지속 시간과 일치하도록 오디오가 가속화됩니다. 'tempo_limit' 오버플로 동안 속도 증가를 제한합니다.tempo_mode="precise" : 자막이 나타나는 지속 시간과 일치하도록 오디오를 가속화합니다. " from subtoaudio import SubToAudio
# Speed up tempo or speech rate
sub = SubToAudio ( model_name = "tts_models/de/thorsten/tacotron2-DDC" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "all" , tempo_speed = 1.3 )
# Change the tempo or speech rate of all audio files , default is 1.2
sub = SubToAudio ( "tts_models/multilingual/multi-dataset/xtts_v1" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "all" , tempo_speed = 1.3 )
# Change tempo or speech rate to audio that doesn't match the subtitle duration
sub = SubToAudio ( fairseq_language = "ind" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "overflow" )
# Limit tempo speed on the overflow mode
sub = SubToAudio ( fairseq_language = "ind" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "overflow" , tempo_limit = 1.2 )
# Match audio length to subtitle duration
sub = SubToAudio ( fairseq_language = "ind" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "precise" ) shift_mode 매개 변수는 자막 지속 시간과 일치하지 않는 오디오를 이동합니다.
shift_mode="right" : 오디오를 오른쪽으로 전환하고 오디오 겹치는 것을 방지합니다.shift_mode="left" : 오디오를 왼쪽으로 전환하고 오디오 중첩을 방지하지만 일부 오디오가 사라질 수 있으므로 왼쪽의 제한된 공간에주의하십시오.shift_mode="interpose" : 오디오를 중간 위치로 전환하고 오디오의 오른쪽과 왼쪽을 방지합니다. (참고 :이 모드는 어리 석으므로 조심스럽게 사용하십시오.)shift_mode="left-overlap" : 오디오 시간을 왼쪽으로 전환하여 겹치는 것을 허용합니다.shift_mode="interpose-overlap" : 오디오를 중간 위치로 전환하여 오버랩을 허용합니다.shift_limit=int or "str" : 오디오 시프트 제한, 밀리 초에 정수를 사용하거나 2.5s 와 같은 문자열을 두 번째로 사용하십시오. from subtoaudio import SubToAudio
# shift mode with limit of 2 second to the right.
sub = SubToAudio ( fairseq_language = "vie" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = sub , tempo_mode = "overflow" , shift_mode = "right" , limit_shift = "2s" )
# shift audio to left position or, time before next subtitle appear
sub = SubToAudio ( fairseq_language = "fra" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = sub , shift_mode = "left-overlap" )
# shift to left, and limit shift only 1 sec.
sub = SubToAudio ( fairseq_language = "ind" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = sub , shift_mode = "left" , shift_limit = 1000 ) # 1000 = 1s from subtoaudio import SubToAudio
# Random Speaker will give you weird result when using bark model with SubToAudio
# Bark random
sub = SubToAudio ( "tts_models/multilingual/multi-dataset/bark" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "overflow" )
# Tortoise random
sub = SubToAudio ( "tts_models/en/multi-dataset/tortoise-v2" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , shift_mode = "overflow" , preset = "fast" )
# To use voice clone you need voice_dir and speaker paramater
# Voice Clone expecting .wav or .npz file inside folder speaker_1
# voice/speaker_1/hana.wav or voice/speaker_1/hana.npz
# if your speaker folder only have .wav file, it will generate .npz file after you runing it.
sub = SubToAudio ( "tts_models/multilingual/multi-dataset/bark" )
subtitle = sub . subtitle ( "yoursubtitle.srt" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "overflow" , voice_dir = "voice/" , speaker = "speaker_1" )
# same with bark, the folder structure like this 'voice/speaker2/ron.wav'
sub = SubToAudio ( "tts_models/en/multi-dataset/tortoise-v2" )
subtitle = sub . subtitle ( "yoursubtitle.ass" )
sub . convert_to_audio ( sub_data = subtitle , tempo_mode = "overflow" , voice_dir = "voice/" , speaker = "speaker2" )Eren, G. 및 Coqui tts 팀. (2021). coqui tts (버전 1.4) [컴퓨터 소프트웨어]. https://doi.org/10.5281/zenodo.6334862