initial commit

This commit is contained in:
Agamemnon Juunes
2024-06-19 12:44:55 -04:00
parent cb7965d7e1
commit 2f30c6c18b
9 changed files with 269 additions and 0 deletions

0
programs/__init__.py Normal file
View File

10
programs/convert.py Normal file
View File

@@ -0,0 +1,10 @@
from utils.ffmpeg_operations import run_ffmpeg_command
def convert_video(input_file, output_file, format):
command = [
"ffmpeg",
"-i", input_file,
output_file
]
run_ffmpeg_command(command)
print(f"Video converted to {format} format and saved as {output_file}")

View File

@@ -0,0 +1,11 @@
from utils.ffmpeg_operations import run_ffmpeg_command
def extract_frames(input_file, output_folder, frame_rate):
command = [
"ffmpeg",
"-i", input_file,
"-vf", f"fps={frame_rate}",
f"{output_folder}/frame_%04d.png"
]
run_ffmpeg_command(command)
print(f"Frames extracted from {input_file} at {frame_rate} fps and saved to {output_folder}")

12
programs/resize.py Normal file
View File

@@ -0,0 +1,12 @@
from utils.ffmpeg_operations import run_ffmpeg_command
def resize_video(input_file, output_file, width, height):
command = [
"ffmpeg",
"-i", input_file,
"-vf", f"scale={width}:{height}",
output_file
]
run_ffmpeg_command(command)
print(f"Video resized to {width}x{height} and saved as {output_file}")

View File

@@ -0,0 +1,39 @@
import sys
from videogrep import parse_transcript, create_supercut
def slncx_main(min_d, max_d, adj, input_file, output_file):
print('DID WE MAKE IT^&(#(*&#(*&#(*&W#(*#&(*#&(*#&(*#&#*(&#))')
print(input_file)
# the min and max duration of silences to extract
min_duration = min_d #0.1
max_duration = max_d #1000.0
# value to to trim off the end of each clip
adjuster = adj #0.0
filenames = input_file
silences = []
try:
for filename in filenames:
timestamps = parse_transcript(filename)
words = []
print(timestamps)
for sentence in timestamps:
words += sentence['words']
for word1, word2 in zip(words[:-2], words[1:]):
start = word1['end']
end = word2['start'] - adjuster
duration = end - start
if duration > min_duration and duration < max_duration:
silences.append({'start': start, 'end': end, 'file': filename})
create_supercut(silences, f"{output_file}.mp4")
return "ok"
except Exception as e:
print(e)
return e

57
requirements.txt Normal file
View File

@@ -0,0 +1,57 @@
annotated-types==0.6.0
beautifulsoup4==4.12.3
blis==0.7.11
Brotli==1.1.0
catalogue==2.0.10
certifi==2024.2.2
cffi==1.16.0
charset-normalizer==3.3.2
click==8.1.7
cloudpathlib==0.16.0
colorama==0.4.6
confection==0.1.4
cupy-cuda11x==12.3.0
cymem==2.0.8
decorator==4.4.2
en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.7.1/en_core_web_sm-3.7.1-py3-none-any.whl#sha256=86cc141f63942d4b2c5fcee06630fd6f904788d2f0ab005cce45aadb8fb73889
fastrlock==0.8.2
idna==3.7
imageio==2.34.1
imageio-ffmpeg==0.4.9
Jinja2==3.1.4
langcodes==3.4.0
language_data==1.2.0
marisa-trie==1.1.1
MarkupSafe==2.1.5
moviepy==1.0.3
murmurhash==1.0.10
mutagen==1.47.0
numpy==1.26.4
packaging==24.0
pillow==10.3.0
preshed==3.0.9
proglog==0.1.10
pycparser==2.22
pycryptodomex==3.20.0
pydantic==2.7.1
pydantic_core==2.18.2
pydub==0.25.1
requests==2.31.0
smart-open==6.4.0
soupsieve==2.5
spacy==3.7.4
spacy-legacy==3.0.12
spacy-loggers==1.0.5
srsly==2.4.8
srt==3.5.3
thinc==8.2.3
tqdm==4.66.4
typer==0.9.4
typing_extensions==4.11.0
urllib3==2.2.1
videogrep==2.3.0
vosk==0.3.45
wasabi==1.1.2
weasel==0.3.4
websockets==12.0
yt-dlp==2024.4.9

0
utils/__init__.py Normal file
View File

View File

@@ -0,0 +1,7 @@
import subprocess
def run_ffmpeg_command(command):
try:
subprocess.run(command, check=True)
except subprocess.CalledProcessError as e:
print(f"An error occurred: {e}")

133
videobeaux.py Normal file
View File

@@ -0,0 +1,133 @@
import typer
import yaml
from pathlib import Path
from programs import silence_extraction, resize, convert, extract_frames
config_file = Path(__file__).parent / "config.yaml"
def load_config():
with open(config_file, 'r') as file:
return yaml.safe_load(file)
config = load_config()
app = typer.Typer()
@app.command()
def silence_xtraction(
min_d: int = typer.Option(None, help="Width of the output video"),
max_d: int = typer.Option(None, help="Height of the output video"),
adj: int = typer.Option(None, help="Height of the output video"),
input_file: str = typer.Option(None, help="Input video file"),
output_file: str = typer.Option(None, help="Output video file")
):
params = {
"min_d": min_d,
"max_d": max_d,
"adj": adj,
"input_file": input_file,
"output_file": output_file,
}
defaults = config['silence_x']
params = {key: params.get(key) or defaults[key] for key in defaults}
silence_extraction.slncx_main(**params)
@app.command()
def resize_video(
input_file: str = typer.Option(None, help="Input video file"),
output_file: str = typer.Option(None, help="Output video file"),
width: int = typer.Option(None, help="Width of the output video"),
height: int = typer.Option(None, help="Height of the output video")
):
"""
Resize a video to the given width and height.
"""
params = {
"input_file": input_file,
"output_file": output_file,
"width": width,
"height": height
}
defaults = config['resize']
params = {key: params.get(key) or defaults[key] for key in defaults}
resize.resize_video(**params)
@app.command()
def convert_video(
input_file: str = typer.Option(None, help="Input video file"),
output_file: str = typer.Option(None, help="Output video file"),
format: str = typer.Option(None, help="Format of the output video")
):
"""
Convert a video to a different format.
"""
if not input_file:
input_file = config['convert']['input_file']
if not output_file:
output_file = config['convert']['output_file']
if not format:
format = config['convert']['format']
convert.convert_video(input_file, output_file, format)
@app.command()
def extract_frames(
input_file: str = typer.Option(None, help="Input video file"),
output_folder: str = typer.Option(None, help="Output folder for frames"),
frame_rate: int = typer.Option(None, help="Frame rate for extracting frames")
):
"""
Extract frames from a video at the specified frame rate.
"""
if not input_file:
input_file = config['extract_frames']['input_file']
if not output_folder:
output_folder = config['extract_frames']['output_folder']
if not frame_rate:
frame_rate = config['extract_frames']['frame_rate']
extract_frames.extract_frames(input_file, output_folder, frame_rate)
if __name__ == "__main__":
app()
'''def main():
parser = argparse.ArgumentParser(description="VideoBeaux - It's You're Best Friend")
subparsers = parser.add_subparsers(title='Subcommands', dest='command', help='Sub-command help')
# Program selection
#add_parser = subparsers.add_parser('program', help='Add a new task')
#add_parser.add_argument('task', type=str, help='The task to add')
# Project Management
#prjmgmt_parser = subparsers.add_parser('project', help='Add a new task')
#prjmgmt_parser.add_argument('--input_file', dest='infile', type=str, help='Full path to input file') # todo - use a path defined in config
#prjmgmt_parser.add_argument('--output_file', dest='outfile', type=str, help='filename of output file that will be save in videobeaux root dir') # todo - use a path defined in config
# Silence Xtraction
silencextraction_parser = subparsers.add_parser('silence-xtraction', help='extracts silence from a given video')
silencextraction_parser.add_argument('--min_d', dest='mind', type=int, help='Minimum duration of a silent chunk')
silencextraction_parser.add_argument('--max_d', dest='maxd', type=int, help='Maximum duration of a silent chunk')
silencextraction_parser.add_argument('--adj', dest='adj', type=int, help='Maximum duration of a silent chunk')
silencextraction_parser.add_argument('--input_file', dest='infile', type=str, help='Full path to input file') # todo - use a path defined in config
silencextraction_parser.add_argument('--output_file', dest='outfile', type=str, help='filename of output file that will be save in videobeaux root dir') # todo - use a path defined in config
args = parser.parse_args()
if args.command == 'silence-xtraction':
silence_extraction.slncx_main(args.mind, args.maxd, args.adj, args.infile, args.outfile)
else:
parser.print_help()
'''