diff --git a/alexandergriffing_spite.py b/alexandergriffing_spite.py new file mode 100644 index 0000000..2a222f3 --- /dev/null +++ b/alexandergriffing_spite.py @@ -0,0 +1,47 @@ +from decimal import Decimal +import itertools + +def sum_series(series): + x = Decimal(0) + i = 0 + t = 0 + l = 0 + # ethical + for value in series: + last_x = x + x += value + if x == last_x: + l += 1 + else: + t = i + l = 0 + if l > (i // 2 + 2): return x + i += 1 + +def power_series(x, coefs): + def f(): + a = Decimal(1) + for coef in coefs: + yield a * coef + a *= x + return sum_series(f()) + +def derivative(power_series): + next(power_series) + for value, i in zip(power_series, itertools.count(1)): + yield i * value + +def cos(): + for i in itertools.count(0): + yield Decimal(-1)**i / Decimal(math.factorial(i * 2)) + yield 0 + +def newton(func, x0): + x = x0 + while True: + fx, fprimex = power_series(x, func()), power_series(x, derivative(func())) + x = x - fx / fprimex + yield x + +for half_pi in newton(cos, 1): + print(half_pi * 2) \ No newline at end of file diff --git a/lesswrong_to_tiktok.py b/lesswrong_to_tiktok.py new file mode 100644 index 0000000..959904d --- /dev/null +++ b/lesswrong_to_tiktok.py @@ -0,0 +1,93 @@ +import wave, sys +import nltk +from balacoon_tts import TTS +from collections import namedtuple +import struct +from PIL import Image, ImageDraw +import cv2 +import numpy +import subprocess + +WIDTH = 400 + +AUDIO = "/tmp/x.wav" +VIDEO = "/tmp/x.avi" +BACKDROP = "/tmp/x.mkv" +OUTPUT = "/tmp/x.mp4" + +def render_text(text: str): + render_params = {"font_size": 24} + im = Image.new("RGBA", (WIDTH, WIDTH)) + draw = ImageDraw.Draw(im) + loc = [0, 0] + toks = text.split() + toks.reverse() + text_commands = [] + while toks: + chunk = [] + while draw.textbbox(loc, " ".join(chunk), **render_params)[2] < WIDTH: + if not toks: break + chunk.append(toks.pop()) + else: toks.append(chunk.pop()) + bbox = draw.textbbox(loc, " ".join(chunk), **render_params) + text_commands.append((tuple(loc), " ".join(chunk))) + loc[1] = bbox[3] + draw.rectangle([0, 0, WIDTH, loc[1]], fill="white") + for loc, text in text_commands: + draw.text(loc, text, fill="black", **render_params) + return im + +Pause = namedtuple("Pause", ["length"]) + +text = open("/home/osmarks/Downloads/seq1.txt").read() + +tts = TTS("/home/osmarks/Downloads/en_us_hifi_jets_cpu.addon") +#supported_speakers = tts.get_speakers() +speaker = "6670" + +def chunks(text: str) -> list[str | Pause]: + out = [] + for line in text.splitlines(): + if line: + for sent in nltk.sent_tokenize(line): + out.append(sent) + out.append(Pause(0.5)) + out.append(Pause(1)) + return out + +RATE = tts.get_sampling_rate() +FPS = 30 + +def wavblank(seconds): + return struct.pack(">h", 0) * round(seconds * RATE / 2) + +blank_frame = render_text("") + +fourcc = cv2.VideoWriter_fourcc(*"MJPG") +video_writer = cv2.VideoWriter(VIDEO, fourcc, FPS, (WIDTH, WIDTH)) +total_dur = 0 +with wave.open(AUDIO, "w") as fp: + fp.setparams((1, 2, RATE, 0, "NONE", "NONE")) + for chunk in chunks(text): + if isinstance(chunk, str): + samples = tts.synthesize(chunk, speaker) + image = render_text(chunk) + elif isinstance(chunk, Pause): + samples = wavblank(chunk.length) + image = blank_frame + fp.writeframes(samples) + duration = len(samples) / RATE # what + total_dur += duration + frame = cv2.cvtColor(numpy.array(image), cv2.COLOR_RGBA2BGR) + for _ in range(round(duration * FPS)): video_writer.write(frame) + print(chunk, duration) +video_writer.release() +subprocess.run([ + "ffmpeg", + "-i", BACKDROP, "-i", AUDIO, "-i", VIDEO, + "-filter_complex", "overlay=x=200:y=200,format=nv12,hwupload", + "-to", str(total_dur), + "-y", + "-vaapi_device", "/dev/dri/renderD128", "-c:v", "h264_vaapi", + OUTPUT +]).check_returncode() \ No newline at end of file diff --git a/memeticize.py b/memeticize.py index 0c3e86a..ab82f5d 100644 --- a/memeticize.py +++ b/memeticize.py @@ -1,6 +1,6 @@ import os, sys, subprocess, datetime -dt_threshold = datetime.datetime(2022, 11, 27).timestamp() +dt_threshold = datetime.datetime(2023, 6, 16).timestamp() _, indir, outdir = sys.argv for x in os.listdir(indir): @@ -19,4 +19,4 @@ for x in os.listdir(indir): os.rename(inpath, newpath) break else: - print("keeping") \ No newline at end of file + print("keeping") diff --git a/rotating_audio.py b/rotating_audio.py new file mode 100644 index 0000000..324bf3d --- /dev/null +++ b/rotating_audio.py @@ -0,0 +1,52 @@ +import pathlib +import numpy as np +import wave +import math +import tempfile +import subprocess +import contextlib + +cyc = 2 +nsamples = 48000 * 60 +path = pathlib.Path("~/Downloads/inputs").expanduser() + +inputs = [] +tempfiles = [] +with contextlib.ExitStack() as stack: + for file in path.glob("*"): + mgr = tempfile.NamedTemporaryFile("w") + stack.enter_context(mgr) + tempfiles.append(mgr) + subprocess.run(["ffmpeg", "-i", file, "-ar", "48000", "-ac", "1", "-filter:a", "dynaudnorm=p=1.0:s=5:g=15", "-y", "-f", "wav", mgr.name]) + + for t in tempfiles: + with wave.open(str(t.name), "r") as w: + assert w.getsampwidth() == 2 and w.getnchannels() == 1 and w.getframerate() == 48000 + inputs.append(np.frombuffer(w.readframes(nsamples), np.dtype(np.int16).newbyteorder("<")).astype(float) / 32768) + +inputs = np.array(inputs) * (1/len(inputs)) # wrong but close enough +offsets = np.broadcast_to(np.linspace(0, math.pi * 2, num=len(inputs) + 1)[:len(inputs)], (nsamples, len(inputs))).transpose() +phase = np.broadcast_to(np.linspace(0, math.pi * 2 * cyc, num=nsamples), (len(inputs), nsamples)) + offsets +empty = np.zeros_like(phase) +x = np.cos(phase) +y = np.sin(phase) + +def writeaudio(file, array): + wr = wave.open(file, "w") + wr.setnchannels(1) + wr.setsampwidth(2) + wr.setframerate(48000) + wr.writeframes((array * 32768).astype(" 0, -x, empty) * inputs)) + writeaudio(right, sum(np.where(x > 0, x, empty) * inputs)) + writeaudio(front, sum(np.where(y > 0, y, empty) * inputs)) + writeaudio(back, sum(np.where(-y > 0, -y, empty) * inputs)) + print(front.name) + # layout is technically front left + front right + back left + back right - ignore + subprocess.run(["ffmpeg", "-i", front.name, "-i", right.name, "-i", back.name, "-i", left.name, "-filter_complex", "[0:a][1:a]join=inputs=4:channel_layout=quad[a]", "-map", "[a]", "/tmp/out.opus"]).check_returncode() \ No newline at end of file