import os import tempfile import subprocess import time import win32com.client # ============================== # USTAWIENIA # ============================== folder = r"D:\Downloads\na telefon" wynik_folder = os.path.join(folder, "wynik") ffmpeg = r"C:\Data\multimedia\codecs\Library\ffmpeg.exe" os.makedirs(wynik_folder, exist_ok=True) # ============================== # SZUKANIE GŁOSU IVONA JACEK # ============================== voice = win32com.client.Dispatch("SAPI.SpVoice") znaleziono = False print("Dostępne głosy:") for v in voice.GetVoices(): nazwa_glosu = v.GetDescription() print(" -", nazwa_glosu) if "IVONA 2 Maja" in nazwa_glosu: voice.Voice = v znaleziono = True if znaleziono: print("Wybrano głos IVONA Jacek.") # wolniejsze czytanie voice.Rate = -4 else: print("Nie znaleziono głosu IVONA Jacek.") print("Używam domyślnego głosu.") # ============================== # TWORZENIE WAV Z IVONY # ============================== def utworz_mowe(tekst): plik_wav = tempfile.mktemp(".wav") stream = win32com.client.Dispatch( "SAPI.SpFileStream" ) stream.Open( plik_wav, 3 ) voice.AudioOutputStream = stream # zatrzymanie poprzedniej syntezy voice.Speak( "", 2 ) # czytanie tekstu voice.Speak( tekst, 0 ) # czekanie na zakończenie mowy voice.WaitUntilDone( 30000 ) # czas na zapis końcówki time.sleep(3) voice.AudioOutputStream = None stream.Close() return plik_wav # ============================== # SPRAWDZENIE PARAMETRÓW MP3 # ============================== def pokaz_parametry(plik): wynik = subprocess.run( [ ffmpeg, "-i", plik ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, encoding="utf-8", errors="ignore" ) tekst = wynik.stderr for linia in tekst.splitlines(): if "Audio:" in linia: print("Parametry:", linia.strip()) # ============================== # ŁĄCZENIE BEZ PONOWNEGO # KODOWANIA ORYGINALNEGO MP3 # ============================== def polacz_audio(wav, mp3, wyjscie): wav_mp3 = tempfile.mktemp(".mp3") # ========================================== # GŁOS IVONA -> MP3 # # 44100 Hz # stereo # 128 kbit/s # # TYLKO GŁOS IVONA JEST KODOWANY. # ORYGINALNY MP3 NIE JEST TU KODOWANY. # ========================================== print("Tworzenie MP3 z głosem IVONA...") rezultat = subprocess.run( [ ffmpeg, "-y", "-i", wav, "-ar", "44100", "-ac", "2", "-codec:a", "libmp3lame", "-b:a", "128k", wav_mp3 ], stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, text=True, encoding="utf-8", errors="ignore" ) if rezultat.returncode != 0: raise Exception( "Nie udało się utworzyć MP3 z głosem IVONA:\n" + rezultat.stderr ) # ========================================== # LISTA PLIKÓW DO POŁĄCZENIA # ========================================== lista = tempfile.mktemp(".txt") with open( lista, "w", encoding="utf-8" ) as f: f.write( "file '" + wav_mp3.replace("\\", "/") + "'\n" ) f.write( "file '" + mp3.replace("\\", "/") + "'\n" ) # ========================================== # POŁĄCZENIE BEZ PONOWNEGO KODOWANIA # # -c copy oznacza: # # NIE DEKODUJ # NIE KODUJ PONOWNIE # # Oryginalny MP3 zostaje skopiowany. # ========================================== print("Dołączanie tytułu bez ponownego kodowania...") rezultat = subprocess.run( [ ffmpeg, "-y", "-f", "concat", "-safe", "0", "-i", lista, "-c:a", "copy", wyjscie ], stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, text=True, encoding="utf-8", errors="ignore" ) if rezultat.returncode != 0: print( "\nFFmpeg zgłosił problem podczas bezstratnego łączenia:" ) print(rezultat.stderr) raise Exception( "Nie udało się połączyć plików MP3 bez ponownego kodowania." ) # ========================================== # USUWANIE PLIKÓW TYMCZASOWYCH # ========================================== if os.path.exists(wav_mp3): os.remove(wav_mp3) if os.path.exists(lista): os.remove(lista) # ============================== # PRZETWARZANIE PLIKÓW MP3 # ============================== for plik in os.listdir(folder): if not plik.lower().endswith(".mp3"): continue if plik.startswith("wynik"): continue sciezka = os.path.join( folder, plik ) wyjscie = os.path.join( wynik_folder, plik ) if os.path.exists(wyjscie): print( "Pominięto:", plik ) continue nazwa = os.path.splitext( plik )[0] print( "\n====================================" ) print( "Przetwarzanie:", plik ) print( "====================================" ) try: # Tytuł jest czytany dwa razy. tekst = nazwa + ". " + nazwa + ". " # ============================== # IVONA # ============================== wav = utworz_mowe( tekst ) print( "WAV:", wav ) # ============================== # ŁĄCZENIE # ============================== polacz_audio( wav, sciezka, wyjscie ) # ============================== # USUWANIE WAV # ============================== if os.path.exists(wav): os.remove(wav) print( "Gotowe:", wyjscie ) print( "Oryginalne nagranie NIE zostało ponownie zakodowane." ) except Exception as e: print( "Błąd:", plik, e ) print( "\nZakończono." )