Zobrazují se příspěvky se štítkemzpomalení. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemzpomalení. Zobrazit všechny příspěvky

středa 21. ledna 2026

Python: Zpomalení videí (.akv) ve složkách - pro moviepy vs 1.0.3

Pracuje s malými segmenty, které by měl kopírovat na ramdisk a pak je sloučí do jednoho zpomaleného videa. Zvuk jsem se snažil zachovat v původních tonech. Je možné dát tam více zpomalovacích faktorů.

#!/usr/bin/env python3
import os

# MoviePy 1.x importuje moduly takto:
from moviepy.editor import VideoFileClip, AudioFileClip, concatenate_videoclips, vfx


"""
MoviePy 2.x importuje moduly takto:
from moviepy import VideoFileClip, concatenate_videoclips
from moviepy.video.fx import all as vfx
from moviepy.audio.io import AudioFileClip
"""
import librosa
import soundfile as sf
import time



# Definice zdrojových a cílových adresářů
source_dirs = [
    "./Jan Kudelka",
    "./Zpěvník Znam i gram - T Stachak"
]

source_ext = "mkv"

# Faktory zpomalení
slowdowns = [4]

# Vytvoření RAM disku (bez skutečného připojení, pokud je ramdisk_disable = True)
ramdisk_disable = True  # Deaktivuje vytvoření RAM disku
ramdisk_path = "./ramdisk"  # Globální RAM disk pro všechny
log_file = "./ramdisk.log"
if not os.path.exists(ramdisk_path):
    os.makedirs(ramdisk_path)

if not ramdisk_disable:
    with open(log_file, "w") as log:
        os.system(f'sudo mount -t tmpfs -o size={ramdisk_size}M tmpfs "{ramdisk_path}"')
        os.system(f'df "{ramdisk_path}" > "{log_file}"')

    with open(log_file, "r") as log:
        log_content = log.read()

    if ramdisk_path in log_content:
        print(f"RAM disk is correctly mounted.")
    else:
        print(f"RAM disk is not found")

# Funkce pro změnu pitchu pomocí ffmpeg
def audio_pitchup_ffmpeg(input_audio_path, output_audio_path, factor):
    command = f'ffmpeg -i "{input_audio_path}" -filter_complex "rubberband=pitch={factor}" "{output_audio_path}"'
    os.system(command)

# Funkce pro změnu rychlosti zvuku pomocí librosa
def change_audio_speed(input_audio_path, output_audio_path, speed_factor, target_duration):
    y, sr = librosa.load(input_audio_path, sr=None)
    original_duration = librosa.get_duration(y=y, sr=sr)
    print(f"Audio duration before stretching: {original_duration} seconds")
    
    y_stretched = librosa.effects.time_stretch(y, rate=original_duration / target_duration)
    stretched_duration = librosa.get_duration(y=y_stretched, sr=sr)
    print(f"Audio duration after stretching: {stretched_duration} seconds")
    time.sleep(2)
    
    sf.write(output_audio_path, y_stretched, sr)

# Převod času na sekundy
def convert_to_seconds(time_str):
    parts = time_str.split(':')
    minutes = int(parts[0])
    seconds = float(parts[1])
    return minutes * 60 + seconds

# Definice časových rozsahů – automaticky po 20 sekundách
def generate_time_ranges(duration, segment_len=10.0):
    ranges = []
    start = 0.0
    while start < duration:
        end = min(start + segment_len, duration)
        # Formát jako máš v kódu
        start_str = f"{int(start // 60)}:{start % 60:05.2f}"
        end_str   = f"{int(end // 60)}:{end % 60:05.2f}"
        ranges.append((start_str, end_str))
        start = end
    return ranges

# Definice časových rozsahů k vyexportování - nahrazeno funkcí generate_time_ranges()
time_ranges = [
    ("0:0.0", "0:10.00"),
    ("0:10.0", "0:20.00"),
    ("0:20.0", "0:30.00"),
    ("0:30.0", "0:40.00"),
    ("0:40.0", "0:50.00"),
    ("0:50.0", "0:60.00"),
    ("1:00.0", "1:10.00"),
    ("1:10.0", "1:20.00")
]

# Zpracování všech souborů v každém zdrojovém adresáři
for source_dir in source_dirs:
    # Vytvoření výstupních složek dynamicky na základě faktorů zpomalení
    output_dirs = [os.path.join(source_dir, str(factor)) for factor in slowdowns]
    for dir in output_dirs:
        os.makedirs(dir, exist_ok=True)
    
    # Získání všech MP4 souborů ve zdrojovém adresáři
    original_files = [f for f in os.listdir(source_dir) if f.endswith(f".{source_ext}")]
    
    for file in original_files:
        video_path = os.path.join(source_dir, file)
        if os.path.isfile(video_path):
            video_clip = VideoFileClip(video_path)
            video_duration = video_clip.duration
            print(f"Video {file}: délka {video_duration:.1f} s")

            time_ranges = generate_time_ranges(video_duration, segment_len=10.0)
            
            # Pro každý faktor zpomalení
            for i, factor in enumerate(slowdowns):
                segment_paths = []
                
                # Zpracování jednotlivých segmentů
                for j, (start_time, end_time) in enumerate(time_ranges):
                    start_seconds = convert_to_seconds(start_time)
                    end_seconds = convert_to_seconds(end_time)
                    # Kontrola, zda rozsah nepřesahuje délku videa
                    if start_seconds >= video_clip.duration:
                        continue
                    end_seconds = min(end_seconds, video_clip.duration)
                    # v 2.0
                    seg_clip = video_clip.subclip(start_seconds, end_seconds)
                    
                    output_segment_path = os.path.join(ramdisk_path, f"segment_{j+1}_slow_{factor}.mp4")
                    
                    # Zpracování zpomalení a pitch pro každý segment
                    segment_audio_path = os.path.join(ramdisk_path, f"segment_{j+1}_temp_audio.wav")
                    seg_clip.audio.write_audiofile(segment_audio_path, codec='pcm_s16le')

                    pitched_audio_path = os.path.join(ramdisk_path, f"segment_{j+1}_new_temp_audio.wav")
                    audio_pitchup_ffmpeg(segment_audio_path, pitched_audio_path, factor)
                    
                    final_audio_path = os.path.join(ramdisk_path, f"segment_{j+1}_final_audio.wav")
                    change_audio_speed(pitched_audio_path, final_audio_path, factor, seg_clip.duration)
                    
                    new_audio_clip = AudioFileClip(final_audio_path)
                    edited_clip = seg_clip.set_audio(new_audio_clip)
                    edited_clip = edited_clip.fx(vfx.speedx, 1.0 / factor)
                    edited_clip.set_duration(edited_clip.duration)

                    print(f"Processing segment {j+1} with slowdown factor {factor} for file {file}. Saving to {output_segment_path}")
                    edited_clip.write_videofile(output_segment_path, codec="libx264", audio_codec="aac")
                    
                    segment_paths.append(output_segment_path)
                    edited_clip.close()
                    new_audio_clip.close()
                    
                    # Odstranění dočasných souborů
                    os.remove(segment_audio_path)
                    os.remove(pitched_audio_path)
                    os.remove(final_audio_path)
                
                # Sloučení zpracovaných segmentů do jednoho videa
                if segment_paths:
                    output_path = os.path.join(output_dirs[i], file)
                    final_clip = concatenate_videoclips([VideoFileClip(seg) for seg in segment_paths])
                    final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac")
                    final_clip.close()

                    # Odstranění dočasných segmentů
                    for segment_path in segment_paths:
                        os.remove(segment_path)

print("Job done.")
if not ramdisk_disable:
    os.system(f'sudo umount "{ramdisk_path}"')

pondělí 26. srpna 2024

Python: Skript na export segmentů videa a jejich zpomalení

Předchozí skript obsahoval vážnou chybu. Zvuk byl příliš opožděn za obrazem asi o 35% a ve výsledku se tam vešla jen 1/2 z původního segmentu. 

Nový skript vypadá dobře. Testováno jen pro zpomalení 8x.

# TENTO SKRIPT S librosou vypadá opravdu správně
# ALE TESTOVAL JSEM TO ZATÍM JEN NA 8X ZPOMALENÍ

# REQUIRES: moviepy, librosa, soundfile
import os
from moviepy.editor import VideoFileClip, concatenate_videoclips, vfx, AudioFileClip
import librosa
import soundfile as sf
import time

# Cesty ke složkám
home_dir = os.path.expanduser("~")
default_path = "/TUTORIALS"
input_dir = os.path.join("/media/toshiba/home/user/Videa", default_path)

file = 'TUTORIAL DRŽENÍ ZÁPĚSTÍ A PRSTY PRAVÉ RUKY -5 cosas que NO debes hacer tocando la guitarra.mp4'
input_path = os.path.join(input_dir, file)

ramdisk_disable = True  # Deaktivuje vytvoření RAM disku

user_choice = input("Chcete použít aktuální složku (.) nebo přednastavenou složku? Zadejte '.' pro aktuální složku nebo 'default' pro přednastavenou složku: ")
if user_choice == '.':
    input_dir = os.path.abspath('.')
    input_path = os.path.join(input_dir, file)

# Faktory zpomalení
# slowdowns = [2, 4, 6, 8, 10, 15, 20, 25]
slowdowns = [8]

# Vytvoření výstupních složek dynamicky na základě faktorů zpomalení
output_dirs = [os.path.join(input_dir, f"Output/{factor}") for factor in slowdowns]
for dir in output_dirs:
    os.makedirs(dir, exist_ok=True)

# Vytvoření RAM disku (bez skutečného připojení, pokud je ramdisk_disable = True)
ramdisk_path = os.path.join(input_dir, "ramdisk")
log_file = os.path.join(input_dir, "ramdisk.log")
if not os.path.exists(ramdisk_path):
    os.makedirs(ramdisk_path)

if not ramdisk_disable:
    with open(log_file, "w") as log:
        os.system(f'sudo mount -t tmpfs -o size={ramdisk_size}M tmpfs "{ramdisk_path}"')
        os.system(f'df "{ramdisk_path}" > "{log_file}"')

    with open(log_file, "r") as log:
        log_content = log.read()

    if ramdisk_path in log_content:
        print(f"RAM disk is correctly mounted.")
    else:
        print(f"RAM disk is not found")

# Funkce pro změnu pitchu pomocí ffmpeg
def audio_pitchup_ffmpeg(input_audio_path, output_audio_path, factor):
    command = f'ffmpeg -i "{input_audio_path}" -filter_complex "rubberband=pitch={factor}" "{output_audio_path}"'
    os.system(command)

# Funkce pro změnu rychlosti zvuku pomocí librosa
def change_audio_speed(input_audio_path, output_audio_path, speed_factor, target_duration):
    # Načtěte původní zvukový soubor
    y, sr = librosa.load(input_audio_path, sr=None)
    
    # Získejte a vytiskněte délku původního zvuku
    original_duration = librosa.get_duration(y=y, sr=sr)
    print(f"Audio duration before stretching: {original_duration} seconds")
    
    # Zrychlete/zpomalte zvuk tak, aby odpovídal nové délce videa
    y_stretched = librosa.effects.time_stretch(y, rate=original_duration / target_duration)
    
    # Získejte a vytiskněte délku zvuku po zpracování
    stretched_duration = librosa.get_duration(y=y_stretched, sr=sr)
    print(f"Audio duration after stretching: {stretched_duration} seconds")
    time.sleep(2)
    
    # Uložte zpracovaný zvuk do nového souboru
    sf.write(output_audio_path, y_stretched, sr)

# Převod času na sekundy
def convert_to_seconds(time_str):
    parts = time_str.split(':')
    minutes = int(parts[0])
    seconds = float(parts[1])
    return minutes * 60 + seconds

# Definice časových rozsahů k vyexportování
time_ranges = [
    ("0:0.0", "0:03.20")  # krátká ukázka základní techniky fingerpickingu když zpomalila
]

# Zpracování jednoho videa file
video_path = input_path
if os.path.isfile(video_path) and video_path.endswith(".mp4"):  # Upravte podle formátu vašich videí
    video_clip = VideoFileClip(video_path)
    
    # Exportování specifikovaných časových úseků jako dočasné soubory
    temp_clips = []
    for start_time, end_time in time_ranges:
        start_seconds = convert_to_seconds(start_time)
        end_seconds = convert_to_seconds(end_time)
        temp_clip = video_clip.subclip(start_seconds, end_seconds)
        temp_clips.append(temp_clip)
    
    # Sloučení úseků do jednoho videa
    temp_joined_path = os.path.join(input_dir, "temp_joined.avi")
    joined_clip = concatenate_videoclips(temp_clips)
    joined_clip.write_videofile(temp_joined_path, codec="libx264", audio_codec="aac")
    
    # Uzavření všech klipů
    for clip in temp_clips:
        clip.close()
    video_clip.close()
    joined_clip.close()
    
    # Zpomalení videí a korekce pitch v audio stopách
    for i, factor in enumerate(slowdowns):
        output_path = os.path.join(output_dirs[i], file)
        edited_clip = VideoFileClip(temp_joined_path)

        # Extrakce a úprava audio stopy
        temp_audio_path = os.path.join(ramdisk_path, "temp_audio.wav")
        edited_clip.audio.write_audiofile(temp_audio_path, codec='pcm_s16le')

        # Změna pitchu zvuku
        new_audio_path = os.path.join(ramdisk_path, "new_temp_audio.wav")
        audio_pitchup_ffmpeg(temp_audio_path, new_audio_path, factor)
        
        # Změna rychlosti upravené audio stopy tak, aby odpovídala nové délce videa
        final_audio_path = os.path.join(ramdisk_path, "final_audio.wav")
        change_audio_speed(new_audio_path, final_audio_path, factor, edited_clip.duration)
        
        new_audio_clip = AudioFileClip(final_audio_path)

        # Vytvoření nového video klipu s upravenou audio stopou
        edited_clip = edited_clip.set_audio(new_audio_clip)
        temp_video_name = os.path.join(ramdisk_path, "temp-final-video.m4a")
        edited_clip.write_videofile(
            temp_video_name,
            codec="libx264",
            audio_codec="aac",
            temp_audiofile=os.path.join(ramdisk_path, 'temp-audio-1.m4a'),
            remove_temp=True,
            threads=4,
            preset='ultrafast'
        )

        # Uzavření dočasných klipů
        edited_clip.close()
        new_audio_clip.close()

        # Znovu otevření video klipu pro zpomalení
        edited_clip = VideoFileClip(temp_video_name)
        edited_clip = edited_clip.fx(vfx.speedx, 1.0 / factor)
        edited_clip.set_duration(edited_clip.duration)

        print(f"Processing {file} with slowdown factor {factor}. Saving to {output_path}")
        edited_clip.write_videofile(
            output_path,
            codec="libx264",
            audio_codec="aac",
            temp_audiofile=os.path.join(ramdisk_path,'temp-audio-2.m4a'),
            remove_temp=True,
            threads=4,
            preset='ultrafast'
        )

        # Uzavření všech klipů
        edited_clip.close()

        # Odstranění dočasných souborů
        if os.path.exists(temp_audio_path):
            os.remove(temp_audio_path)
        if os.path.exists(new_audio_path):
            os.remove(new_audio_path)
        if os.path.exists(final_audio_path):
            os.remove(final_audio_path)
        if os.path.exists(temp_video_name):
            os.remove(temp_video_name)

    # Odstranění dočasného sloučeného videa
    if os.path.exists(temp_joined_path):
        os.remove(temp_joined_path)

print("Job done.")
if not ramdisk_disable:
    os.system(f'sudo umount "{ramdisk_path}"')
 

neděle 28. července 2024

Skript na zpomalení videa (copyright Radek Šimánek)

Jsem autorem tohoto programu, který generuje zpomalené videa do složky Output, do jednotlivých adresářů. Unikátnost spočívá v tom, že je ve výsledném videu jsou zachovány tóny ve zvuku. V každém adresáři budou soubory podle faktoru zpomalení. Klíčové pro mě bylo vytvořit ramdisk. Díky tomu se dočasné soubory nekopírují na fyzický disk. Program lze spustit na linuxu, testováno na python3.

Licence je nekomerční - za poplatek 200 Kč si můžete program zkopírovat do svého PC za účelem zřízení kopie pouze pro vás své použití. Psal jsem to 6 hodin. V případě zájmu o zaplacení licenčního poplatku mi napište komentář a pošlu vám číslo svého účtu.


# Autor: Radek Šimánek, 28.7.2024
# REQUIRES: moviepy a pydub
# librosa měla problém s kompatibilitou, takže jsem použil pydub
import os
from moviepy.editor import VideoFileClip, vfx, AudioFileClip
from pydub import AudioSegment

ramdisk_size = 50 # unit MB

# Cesty ke složkám
home_dir = os.path.expanduser("~")
default_path = "Videa/Kytarové rytmy - strumming patterns"
input_dir = os.path.join(home_dir, default_path)

os.system('clear')
print("Zadejte heslo sudo, pro vytvoření ramdisku.")
os.system('sudo echo " "')
user_choice = input("Chcete použít aktuální složku (.) nebo přednastavenou složku? Zadejte '.' pro aktuální složku nebo 'default' pro přednastavenou složku: ")
if user_choice == '.':
input_dir = os.path.abspath('.')

# Faktory zpomalení
slowdowns = [5, 6, 8, 10]

# Vytvoření výstupních složek dynamicky na základě faktorů zpomalení
output_dirs = [os.path.join(input_dir, f"Output/{factor}") for factor in slowdowns]
for dir in output_dirs:
os.makedirs(dir, exist_ok=True)

# Funkce pro změnu pitch audia bez změny rychlosti
def audio_pitchup_ffmpeg(input_audio_path, output_audio_path, factor):
command = f'ffmpeg -i "{input_audio_path}" -filter_complex "rubberband=pitch={factor}" "{output_audio_path}"'
os.system(command)

# Vytvoření RAM disku
ramdisk_path = os.path.join(input_dir, "ramdisk")
log_file = os.path.join(input_dir, "ramdisk.log")
if not os.path.exists(ramdisk_path):
os.makedirs(ramdisk_path)
with open(log_file, "w") as log:
os.system(f'sudo mount -t tmpfs -o size={ramdisk_size}M tmpfs "{ramdisk_path}"')
os.system(f'df "{ramdisk_path}" > "{log_file}"')

with open(log_file, "r") as log:
log_content = log.read()

if ramdisk_path in log_content:
print(f"RAM disk is correctly mounted.")
else:
print(f"RAM disk is not found")
 
# Zpomalení videí a korekce tónu
for video_file in os.listdir(input_dir):
video_path = os.path.join(input_dir, video_file)
if os.path.isfile(video_path) and video_file.endswith(".mp4"): # Upravte podle formátu vašich videí
for i, factor in enumerate(slowdowns):
output_path = os.path.join(output_dirs[i], video_file)
video_clip = VideoFileClip(video_path)
# Extrakce a úprava audio stopy
temp_audio_path = os.path.join(ramdisk_path, "temp_audio.wav")
video_clip.audio.write_audiofile(temp_audio_path, codec='pcm_s16le')
new_audio_path = os.path.join(ramdisk_path, "new_temp_audio.wav")
audio_pitchup_ffmpeg(temp_audio_path, new_audio_path, factor)
new_audio_clip = AudioFileClip(new_audio_path)
# Vytvoření nového video klipu s upravenou audio stopou
# Musí se dočasně uložit do souboru:
edited_clip = video_clip.set_audio(new_audio_clip)
temp_video_name = 'temp-final-video.m4a'
edited_clip.write_videofile(
os.path.join(ramdisk_path, temp_video_name),
codec="libx264",
audio_codec="aac",
temp_audiofile=os.path.join(ramdisk_path,'temp-audio-1.m4a'),
remove_temp=True,
threads=4,
preset='ultrafast'
)
video_clip.close()
new_audio_clip.close()
edited_clip = VideoFileClip(os.path.join(ramdisk_path, temp_video_name))


edited_clip = edited_clip.fx(vfx.speedx, 1.0 / factor)
edited_clip.set_duration(edited_clip.duration)
a = edited_clip.audio.duration
v = edited_clip.duration

print(f"Processing {video_file} with slowdown factor {factor}. Saving to {output_path}")
edited_clip.write_videofile(
output_path,
codec="libx264",
audio_codec="aac",
temp_audiofile=os.path.join(ramdisk_path,'temp-audio-2.m4a'),
remove_temp=True,
threads=4,
preset='ultrafast'
)
edited_clip.close()
# Odstranění dočasných souborů z ramdisku
if os.path.exists(temp_audio_path):
os.remove(temp_audio_path)
if os.path.exists(new_audio_path):
os.remove(new_audio_path)
if os.path.exists(os.path.join(ramdisk_path, temp_video_name)):
os.remove(os.path.join(ramdisk_path, temp_video_name))
print("Job done.")
print("sudo unmount ramdisk")
os.system(f'sudo umount "{ramdisk_path}"')


automad je dobrý cms na vytváření flat-file blokových prezentací

 automad je dobrý cms na vytváření flat-file blokových prezentací

Štítky

.profile adm administrace Adobe Aho-Corasick AI akcelerace alfa transparence analýza AND any aplikace apt ar archiv asociativní pole atomicity audacity audio audio redirect autentifikace automad automatizace awk balíčkovací systém bash beacon beacon_hint benchmark Bézierovy křivky bezpečnost biblehub BJT blogger boolean Braessův paradox brainstorming BRE buffer buffering bufferované čtení Cache-Conrol Cloudflare cms code Collector Cut-off ColorManager colorpicker common compare config cookies CPU CPU pipe crop css CSS3 curl current code cut čas data loss data lost data transfer reliability datasheet datetime.strptime deb deb-systemd-helper debian debián depricated development dict dioda diody disonance doprava dpkg dpkg -S dpkg-deb drivers EBO editace efekt Emitter Cut-off Current eps ETag evtest exclude exec Expires extrakce jediného extrakce názvu balíčku souboru extrakce obrázků extrakce souboru .deb fflock fflush ffmpeg FIFO file read file write file_get_contents file_get_contents/file_put_contents file_put_contents filter find first_install.sh flat-file flock Fly-back dioda font-face fonty fóra formant-preserving morphing fotorezistor fread functions funkce FuzzyWuzzy fwrite gate gate drive GDVfs gedit gedit-common geolokace getdata Ghostscript GIO glib gnome gnome settings GNU Privacy Guard gnupg gpg gradient-background grafika grep grep -v groupadd grub grub update gs gsettings gtk gtk.css gtk+ hebrejština history hlavičky HS html html 5 https hudba hunspell charakterizace chatGPT chroot chyba ICES IGBT Image img sizes img srcset impedance implementace imshow inference inkscape inrush current install IQ jalový výkon javascript javescript jednocení seznamů js jsonData kapacita součástek klávesnice koeficient zesílení komponenty xFce komunikace se serverem koncept konfigurace kontejner korekce barev Krita KSF kvantifikátor kytara Last-Modified lazy caching led LEFT JOIN librosa ligatury light-locker lightdm linux list log m3u maják manuál map mapování maskování maskování hlasu maskování služby masky matplotlib Max-Age measure melodie memory měření meta MFCC MFCC koeficienty mint Mint 21.3 Mint xFce míry mlt modules moralizace morphologie MOSFET mount moviepy multimedia mysql náběhový proud napěťová ochrana nastavení šablony návod návrh nel Network Error Logging NLP normalizace šedi po resize not Notifications noty NTFS nth-child oblasti oblékání ochrana okruhy přátel OpenVINO IR formát oprava oprava balíčku optočlen org.gnome.desktop.screensaver org.gnome.nm-applet ořezové masky OSHB otázky otázky_jazyky otázky_moralismu_řešení overlay ovladače panely parsování path pdf personifikace photorec php php 4 php 5 php 6 php 7 php 8 phpbb phpBB3 PipeWire pitch plus PN přechody pnp pole Policykit postscript práva profilování program prune průraz přeinstalování překlad přepěťová ochrana přepolování příkazy připojení připojení k síti připojení k wifi pseudokódd pstoedit pulse PulseAudio PWM regulátory pydub python python3 pytorch ramdisk RBE RDSon read reaktance rectifier redakční systém regex regulace vstupního napětí reinstall relyability remount replace restore reverzní geolokace RIGHT JOIN rm robotický hlas role rozvržení disků pro OS linux a data databází řešení samba scan scroll sd karta sdílení sdílení souborů Sec-Fetch-Dest Sec-Fetch-Mode Sec-Fetch-Site Sec-Fetch-User Secure Shell sed Set Cookie show-manual-login show-remote-login shunt schemas schémata schottka signal morphing sink skript skupiny sledovanost sloupce slučování seznamů služby small song sort soubory soundfile spínané zdroje spínání splines split spojování správa diskových zařízení SQL ssh stabilizace napětí stahování stíny stream stream redirect string strojové učení stropové učení subprocess.call supplicant svg syntax systemctl systemd-logind T5 tabulka tabulky Tangentové úsečky tar témata tepelná ztráta terminologie test text-shadow themes thermal runaway time timestamp tkinter tr transformace transistor transition transpose tranzistor tranzistory TS ttf tuple tvorba otázek TVS typografie ubuntu účiník udiskd udisks unconfined underrun unity-greeter update usb usermod uživatelé va charakteristika vala věda vektorová grafika Vgs video virtual devices vocoder Vth vyhledávání vyhledávání soborů výkon vynechání adresářů vytvoření playlistu vývoj webovka while wpa wpa_supplicant wrapovací funkce x xandr xapp-watt xargs -I xed xed-common xfdesktop xml xmp XOR Xorg Xorg Thumbnails xrandr závislosti zdánlivý výkon zdroj zenerka zenerovo napětí zip zip archiv zkratky zpomalení zpracování textu zrychlení zvuk Žalmy