diff --git a/assets/poacher_intro.wav b/assets/poacher_intro.wav new file mode 100644 index 0000000..242bc15 Binary files /dev/null and b/assets/poacher_intro.wav differ diff --git a/assets/static.wav b/assets/static.wav new file mode 100644 index 0000000..5036293 Binary files /dev/null and b/assets/static.wav differ diff --git a/output/nerdletter_secret_01_page001.mp4 b/output/nerdletter_secret_01_page001.mp4 new file mode 100644 index 0000000..a744860 Binary files /dev/null and b/output/nerdletter_secret_01_page001.mp4 differ diff --git a/scripts/nerdletter_numbers_station.sh b/scripts/nerdletter_numbers_station.sh new file mode 100755 index 0000000..e758588 --- /dev/null +++ b/scripts/nerdletter_numbers_station.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION MP4 GENERATOR +# Lincolnshire Poacher style — retro drama for the Day Book crowd + +MESSAGE="$1" # e.g. "HLXIB JACJP ERXHN EFM" +PAGE="$2" # e.g. 001 +EPISODE="${3:-01}" # Secret Message number + +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" +TMP_WAV="temp_voice.wav" +TMP_VIDEO="temp_bg.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" +echo "Page ${PAGE} — Generating spoken MP4..." + +# 1. Create spoken audio (female voice, slow, numbers-station style) +echo "NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${MESSAGE}" | \ +espeak-ng -ven+f3 -s120 -k20 -a 150 -w "$TMP_WAV" \ + --punct="" --sep=" " 2>/dev/null + +# 2. Create simple retro video background (black screen with green text, 15 seconds) +ffmpeg -f lavfi -i color=black:s=1280x720:d=15 \ + -vf "drawtext=font='Courier':fontsize=48:fontcolor=green@0.9:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, + drawtext=font='Courier':fontsize=36:fontcolor=green@0.8:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=160, + drawtext=font='Courier':fontsize=42:fontcolor=lime:text='${MESSAGE}':x=(w-text_w)/2:y=280:box=1:boxcolor=black@0.6:boxborderw=10, + drawtext=font='Courier':fontsize=28:fontcolor=green@0.7:text='DESTROY PAGE AFTER USE':x=(w-text_w)/2:y=620" \ + -c:v libx264 -t 15 -pix_fmt yuv420p "$TMP_VIDEO" -y + +# 3. Combine voice + video +ffmpeg -i "$TMP_VIDEO" -i "$TMP_WAV" -c:v copy -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f "$TMP_WAV" "$TMP_VIDEO" + +echo "✅ Done! → ${OUTFILE}" +echo "Upload this to the website with the ciphertext text below it." + diff --git a/scripts/nerdletter_numbers_station_linux.sh b/scripts/nerdletter_numbers_station_linux.sh new file mode 100755 index 0000000..bf7e918 --- /dev/null +++ b/scripts/nerdletter_numbers_station_linux.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION MP4 GENERATOR — Letter-by-Letter Edition +# Real cold-war numbers station pronunciation + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" +echo "Page ${PAGE} — Generating spoken MP4..." + +# === CRITICAL FIX: Convert groups to spaced letters for proper pronunciation === +SPACED_MESSAGE=$(echo "$MESSAGE" | sed 's/\([A-Z]\)/\1 /g' | sed 's/ / /g') + +# Spoken announcement (clear and dramatic) +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED_MESSAGE}" + +echo "$TEXT_TO_SPEAK" | \ +espeak-ng -ven+f3 -s105 -k40 -a 180 -w temp_voice.wav --punct="" 2>/dev/null + +# Video with retro green text +ffmpeg -f lavfi -i color=black:s=1280x720:d=22 -c:v libx264 -t 22 -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i temp_voice.wav \ +-vf "drawtext=font='Courier':fontsize=52:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=38:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=46:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=280:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=32:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f temp_voice.wav temp_bg.mp4 + +echo "✅ Done! → ${OUTFILE}" +echo "Now each group should be spoken letter-by-letter like a real numbers station." diff --git a/scripts/nerdletter_numbers_station_mac.sh b/scripts/nerdletter_numbers_station_mac.sh new file mode 100755 index 0000000..4b8f868 --- /dev/null +++ b/scripts/nerdletter_numbers_station_mac.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION MP4 GENERATOR — macOS Fixed +# Lincolnshire Poacher style, using drawtext (more reliable on Homebrew) + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" +echo "Page ${PAGE} — Generating spoken MP4..." + +# 1. Spoken audio (classic numbers station voice) +echo "NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${MESSAGE}" | \ +espeak-ng -ven+f3 -s115 -k25 -a 160 -w temp_voice.wav --punct="" 2>/dev/null + +# 2. Create background video + burn text with drawtext (no subtitles filter needed) +ffmpeg -f lavfi -i color=black:s=1280x720:d=18 -c:v libx264 -t 18 -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i temp_voice.wav \ +-vf "drawtext=font='Courier New':fontsize=48:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier New':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=160, \ +drawtext=font='Courier New':fontsize=42:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=260:box=1:boxcolor=black@0.7:boxborderw=12, \ +drawtext=font='Courier New':fontsize=28:fontcolor=green@0.7:text='DESTROY PAGE AFTER USE':x=(w-text_w)/2:y=620" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f temp_voice.wav temp_bg.mp4 + +echo "✅ Done! → ${OUTFILE}" +echo "Upload this MP4 + the text groups to the website." diff --git a/scripts/nerdletter_numbers_station_mac_old.sh b/scripts/nerdletter_numbers_station_mac_old.sh new file mode 100755 index 0000000..ef8f7b9 --- /dev/null +++ b/scripts/nerdletter_numbers_station_mac_old.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION MP4 GENERATOR — macOS friendly +# Lincolnshire Poacher style for the retro crowd + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" +echo "Page ${PAGE} — Generating spoken MP4..." + +# 1. Spoken audio (classic numbers-station female voice) +echo "NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${MESSAGE}" | \ +espeak-ng -ven+f3 -s115 -k25 -a 160 -w temp_voice.wav --punct="" 2>/dev/null + +# 2. Simple retro video (black background + green text) — no drawtext needed +ffmpeg -f lavfi -i color=black:s=1280x720:d=18 -c:v libx264 -t 18 -pix_fmt yuv420p temp_bg.mp4 -y + +# Overlay text using subtitles (much more reliable on Homebrew ffmpeg) +cat > temp_sub.srt << EOF +1 +00:00:01,000 --> 00:00:18,000 +NERDLETTER SECRET TRANSMISSION #${EPISODE} +USE DAY BOOK PAGE ${PAGE} + +${MESSAGE} + +DESTROY PAGE AFTER USE +EOF + +# 3. Burn in subtitles + combine audio +ffmpeg -i temp_bg.mp4 -i temp_voice.wav -vf subtitles=temp_sub.srt:force_style='Fontname=Courier New,Fontsize=42,PrimaryColour=&H00FF00&,BackColour=&H80000000&,BorderStyle=3' \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f temp_voice.wav temp_bg.mp4 temp_sub.srt + +echo "✅ Done! → ${OUTFILE}" +echo "Upload this MP4 to the website. Subscribers will feel like they're tuning into a real numbers station." + diff --git a/scripts/nerdletter_numbers_station_poacher.sh b/scripts/nerdletter_numbers_station_poacher.sh new file mode 100755 index 0000000..1bbde4f --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION MP4 GENERATOR — ULTIMATE DRAMA EDITION +# Slow letter-by-letter + shortwave static + Lincolnshire Poacher intro + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" +echo "Page ${PAGE} — Generating spoken MP4 with full drama..." + +# === 1. Spaced letters for slow, deliberate pronunciation === +SPACED=$(echo "$MESSAGE" | sed 's/\([A-Z]\)/\1 /g' | sed 's/ / /g') + +# === 2. Full text to speak (very slow & spooky) === +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED}" + +echo "$TEXT_TO_SPEAK" | \ +espeak-ng -ven+f3 -s80 -k50 -a 200 -w voice_main.wav --punct="" 2>/dev/null + +# === 3. Download / prepare assets (run once) === +if [ ! -f poacher_intro.wav ]; then + echo "Downloading public-domain Lincolnshire Poacher intro (short 12-second clip)..." + # Using a free direct link from The Conet Project style recording (public domain use) + wget -q -O poacher_intro.wav "https://archive.org/download/The-Conet-Project/The%20Conet%20Project%20-%20Recordings%20of%20Shortwave%20Numbers%20Stations%20%281997%29%20%5B2013%20-%2015th%20Anniversary%20Bonus%20Disc%20Edition%5D%20%5BFLAC%5D/Disc%201/06%20-%20The%20Lincolnshire%20Poacher.flac" || \ + echo "Manual download needed — see note below" +fi + +if [ ! -f static.wav ]; then + echo "Generating shortwave static..." + ffmpeg -f lavfi -i "anoisesrc=d=25:c=0.3" -af "highpass=f=3000,lowpass=f=8000" -t 25 static.wav -y 2>/dev/null +fi + +# === 4. Mix audio: Poacher intro + static + voice === +ffmpeg -i poacher_intro.wav -i static.wav -i voice_main.wav \ +-filter_complex "[0:a]volume=0.65[a1];[1:a]volume=0.25[a2];[a1][a2]amix=inputs=2:duration=first[a3];[a3][2:a]amix=inputs=2:duration=first,volume=1.1" \ +-c:a pcm_s16le -y final_audio.wav 2>/dev/null + +# === 5. Video with retro text === +ffmpeg -f lavfi -i color=black:s=1280x720:d=28 -c:v libx264 -t 28 -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f voice_main.wav final_audio.wav temp_bg.mp4 + +echo "✅ Done! → ${OUTFILE}" +echo "Full cold-war numbers station experience achieved." diff --git a/scripts/nerdletter_numbers_station_poacher10.sh b/scripts/nerdletter_numbers_station_poacher10.sh new file mode 100755 index 0000000..efbc942 --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher10.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION — FIXED LETTER-BY-LETTER + PAUSES + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" + +# 1. Intro voice +INTRO="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}." +echo "$INTRO" | espeak-ng -ven+f3 -s80 -k50 -a 200 -w intro.wav --punct="" 2>/dev/null + +# 2. Build full groups voice letter-by-letter with pauses +> groups_voice.wav # start fresh + +for group in $MESSAGE; do + echo "Processing group: $group" + for ((i=0; i<${#group}; i++)); do + letter="${group:$i:1}" + echo "$letter" | espeak-ng -ven+f3 -s74 -k65 -a 210 -w temp.wav 2>/dev/null + cat temp.wav >> groups_voice.wav + rm temp.wav + done + # 1 second pause after each group + ffmpeg -f lavfi -i "anullsrc=r=22050" -t 1.05 silence.wav -y 2>/dev/null + cat silence.wav >> groups_voice.wav + rm silence.wav +done + +# Combine intro + groups +ffmpeg -i intro.wav -i groups_voice.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -c:a pcm_s16le -y voice.wav 2>/dev/null + +echo "✅ Full voice track built (letter-by-letter with pauses)" + +# 3. Static (if missing) +if [ ! -f static.wav ]; then + ffmpeg -f lavfi -i "anoisesrc=d=50:c=0.22" -af "highpass=f=2500,lowpass=f=9000,volume=0.22" -t 50 static.wav -y 2>/dev/null +fi + +# 4. Final mix: Poacher tune → Voice, static under everything +ffmpeg -i poacher_intro.wav -i static.wav -filter_complex "[0:a][1:a]amix=inputs=2:duration=first" -c:a pcm_s16le -y tune_static.wav 2>/dev/null + +ffmpeg -i tune_static.wav -i voice.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +# 5. Video +DUR=48 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DUR -c:v libx264 -t $DUR -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +rm -f intro.wav groups_voice.wav tune_static.wav temp_bg.mp4 +echo "✅ DONE! → ${OUTFILE}" diff --git a/scripts/nerdletter_numbers_station_poacher2.sh b/scripts/nerdletter_numbers_station_poacher2.sh new file mode 100755 index 0000000..42555ca --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher2.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION — FINAL SEQUENCE EDITION +# Poacher tune → Voice announcement → Static throughout + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" +echo "Building full sequence with Poacher intro first..." + +# 1. Spaced letters for slow pronunciation +SPACED=$(echo "$MESSAGE" | sed 's/\([A-Z]\)/\1 /g' | sed 's/ / /g') + +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED}" + +echo "$TEXT_TO_SPEAK" | \ +espeak-ng -ven+f3 -s82 -k50 -a 200 -w voice.wav --punct="" 2>/dev/null + +# 2. Ensure assets exist +if [ ! -f poacher_intro.wav ]; then + echo "⚠️ poacher_intro.wav not found — please add a 10-15 second clip manually." + echo " (Download from The Conet Project and trim first 12 seconds)" + exit 1 +fi + +if [ ! -f static.wav ]; then + echo "Generating continuous shortwave static..." + ffmpeg -f lavfi -i "anoisesrc=d=40:c=0.28" -af "highpass=f=2800,lowpass=f=8500,volume=0.22" -t 40 static.wav -y 2>/dev/null +fi + +# 3. Create sequenced audio: Poacher → Voice (with static under everything) +ffmpeg -i poacher_intro.wav -i voice.wav -i static.wav \ +-filter_complex " +[0:a]volume=0.75[poach]; +[1:a]volume=1.05[voice]; +[2:a]volume=0.28[stat]; +[poach][stat]amix=duration=first[a1]; +[a1][voice]acrossfade=d=1.2:o=1:c1=exp:c2=exp[a2]; +[stat][a2]amix=duration=longest,volume=1.1[final] +" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +# 4. Video (long enough for intro + voice) +ffmpeg -f lavfi -i color=black:s=1280x720:d=32 -c:v libx264 -t 32 -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f voice.wav final_audio.wav temp_bg.mp4 + +echo "✅ Done! → ${OUTFILE}" +echo "Sequence: Poacher tune first → Voice → Static throughout" diff --git a/scripts/nerdletter_numbers_station_poacher3.sh b/scripts/nerdletter_numbers_station_poacher3.sh new file mode 100755 index 0000000..22a1da9 --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher3.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION — SIMPLE & RELIABLE SEQUENCE +# Poacher intro first → Voice → Static continuous underneath + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" + +# 1. Spaced letters + text +SPACED=$(echo "$MESSAGE" | sed 's/\([A-Z]\)/\1 /g' | sed 's/ / /g') +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED}" + +echo "$TEXT_TO_SPEAK" | espeak-ng -ven+f3 -s82 -k50 -a 200 -w voice.wav --punct="" 2>/dev/null + +# 2. Make sure assets exist +if [ ! -f poacher_intro.wav ]; then + echo "❌ Missing poacher_intro.wav — add a 12-15 second clip" + exit 1 +fi + +if [ ! -f static.wav ]; then + echo "Generating static..." + ffmpeg -f lavfi -i "anoisesrc=d=40:c=0.25" -af "highpass=f=2800,lowpass=f=8500,volume=0.22" -t 40 static.wav -y 2>/dev/null +fi + +# 3. Simple sequential mix: Poacher → Voice, with static under both +ffmpeg -i poacher_intro.wav -i voice.wav -i static.wav \ +-filter_complex " +[0:a]volume=0.72[poach]; +[1:a]volume=1.05[voice]; +[2:a]volume=0.25[stat]; +[poach][stat]amix=duration=first[a1]; +[voice][stat]amix=duration=first[a2]; +[a1][a2]concat=v=0:a=1[out] +" -map "[out]" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +# 4. Video +DURATION=32 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DURATION -c:v libx264 -t $DURATION -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f voice.wav final_audio.wav temp_bg.mp4 + +echo "✅ Done! → ${OUTFILE}" +echo "Sequence: Poacher tune → Voice announcement, static throughout" diff --git a/scripts/nerdletter_numbers_station_poacher4.sh b/scripts/nerdletter_numbers_station_poacher4.sh new file mode 100755 index 0000000..cd683ea --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher4.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION — RELIABLE SEQUENCE +# Poacher intro (first) → Voice (letter-by-letter) → Static continuous + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" + +# 1. Prepare voice (slow letter-by-letter) +SPACED=$(echo "$MESSAGE" | sed 's/\([A-Z]\)/\1 /g' | sed 's/ / /g') +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED}" + +echo "$TEXT_TO_SPEAK" | espeak-ng -ven+f3 -s80 -k55 -a 200 -w voice.wav --punct="" 2>/dev/null + +# 2. Assets check +if [ ! -f poacher_intro.wav ]; then + echo "❌ Missing poacher_intro.wav — add a 10-15 second clip" + exit 1 +fi + +if [ ! -f static.wav ]; then + echo "Generating continuous static..." + ffmpeg -f lavfi -i "anoisesrc=d=45:c=0.22" -af "highpass=f=2500,lowpass=f=9000,volume=0.20" -t 45 static.wav -y 2>/dev/null +fi + +# 3. Reliable audio mix: Poacher → Voice, static under everything +ffmpeg -i poacher_intro.wav -i voice.wav -i static.wav \ +-filter_complex " +[0:a]volume=0.70[poach]; +[1:a]volume=1.10[voice]; +[2:a]volume=0.24[stat]; +[poach][stat]amix=duration=first:dropout_transition=2[a1]; +[voice][stat]amix=duration=first:dropout_transition=2[a2]; +[a1][a2]concat=v=0:a=1[out] +" -map "[out]" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +# 4. Video (long enough) +DUR=34 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DUR -c:v libx264 -t $DUR -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f voice.wav final_audio.wav temp_bg.mp4 + +echo "✅ Done! → ${OUTFILE}" +echo "Poacher first → Voice → Static throughout" diff --git a/scripts/nerdletter_numbers_station_poacher5.sh b/scripts/nerdletter_numbers_station_poacher5.sh new file mode 100755 index 0000000..2dd87a6 --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher5.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION — SUPER SIMPLE & RELIABLE +# Step-by-step mix so we can see exactly what’s happening + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" + +# 1. Voice track (slow letter-by-letter) +SPACED=$(echo "$MESSAGE" | sed 's/\([A-Z]\)/\1 /g' | sed 's/ / /g') +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED}" + +echo "$TEXT_TO_SPEAK" | espeak-ng -ven+f3 -s78 -k60 -a 210 -w voice.wav --punct="" 2>/dev/null +echo "✅ Voice track created ($(wc -c < voice.wav) bytes)" + +# 2. Static +if [ ! -f static.wav ]; then + echo "Generating static..." + ffmpeg -f lavfi -i "anoisesrc=d=45:c=0.22" -af "highpass=f=2500,lowpass=f=9000,volume=0.20" -t 45 static.wav -y 2>/dev/null +fi + +# 3. Mix in TWO simple steps +echo "Mixing Poacher + Voice + Static..." + +# Step 3a: Poacher + Static +ffmpeg -i poacher_intro.wav -i static.wav -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=3" -c:a pcm_s16le -y poacher_static.wav 2>/dev/null + +# Step 3b: Add voice after Poacher ends +ffmpeg -i poacher_static.wav -i voice.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +echo "✅ Final audio created ($(wc -c < final_audio.wav) bytes)" + +# 4. Video +DUR=38 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DUR -c:v libx264 -t $DUR -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f voice.wav poacher_static.wav temp_bg.mp4 + +echo "✅ Done! → ${OUTFILE}" +echo "Check the length of final_audio.wav — it should be much longer than just the Poacher tune." diff --git a/scripts/nerdletter_numbers_station_poacher6.sh b/scripts/nerdletter_numbers_station_poacher6.sh new file mode 100755 index 0000000..5fd789a --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher6.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# NERDLETTER — CLEAN TUNE + VOICE + STATIC + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +SPACED=$(echo "$MESSAGE" | sed 's/\([A-Z]\)/\1 /g' | sed 's/ / /g') +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED}" + +echo "$TEXT_TO_SPEAK" | espeak-ng -ven+f3 -s78 -k60 -a 210 -w voice.wav --punct="" 2>/dev/null + +# Mix: Tune → Voice, static underneath +ffmpeg -i poacher_intro.wav -i voice.wav -i static.wav \ +-filter_complex " +[0:a]volume=0.65[tune]; +[1:a]volume=1.15[voice]; +[2:a]volume=0.22[stat]; +[tune][stat]amix=duration=first[a1]; +[voice][stat]amix=duration=first[a2]; +[a1][a2]concat=n=2:v=0:a=1[out] +" -map "[out]" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +DUR=38 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DUR -c:v libx264 -t $DUR -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +rm -f voice.wav temp_bg.mp4 +echo "✅ Done! → ${OUTFILE}" diff --git a/scripts/nerdletter_numbers_station_poacher7.sh b/scripts/nerdletter_numbers_station_poacher7.sh new file mode 100755 index 0000000..f472be3 --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher7.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION — FINAL PERFECT VERSION + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" + +# 1. Create voice with 1-second pauses between groups +SPACED_GROUPS=$(echo "$MESSAGE" | sed 's/\([A-Z]\{5\}\)/\1 /g' | sed 's/ / /g') +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED_GROUPS// / }" + +echo "$TEXT_TO_SPEAK" | espeak-ng -ven+f3 -s76 -k55 -a 205 -w voice.wav --punct="" --ssml 2>/dev/null + +# 2. Assets +if [ ! -f static.wav ]; then + ffmpeg -f lavfi -i "anoisesrc=d=50:c=0.22" -af "highpass=f=2500,lowpass=f=9000,volume=0.20" -t 50 static.wav -y 2>/dev/null +fi + +# 3. Mix with gentle overlap +ffmpeg -i poacher_intro.wav -i voice.wav -i static.wav \ +-filter_complex " +[0:a]volume=0.68,atrim=0:14[a0]; # tune ~14 seconds +[1:a]volume=1.12[a1]; +[2:a]volume=0.23[stat]; +[a0][stat]amix=duration=first[a_tune]; +[a1][stat]amix=duration=first[a_voice]; +[a_tune][a_voice]acrossfade=d=2.5:o=1[cross]; +[cross][stat]amix=duration=longest[out] +" -map "[out]" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +# 4. Video +DUR=42 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DUR -c:v libx264 -t $DUR -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +rm -f voice.wav temp_bg.mp4 +echo "✅ Done! → ${OUTFILE}" diff --git a/scripts/nerdletter_numbers_station_poacher8.sh b/scripts/nerdletter_numbers_station_poacher8.sh new file mode 100755 index 0000000..d75613d --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher8.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# NERDLETTER NUMBERS STATION — ULTRA SIMPLE & RELIABLE FINAL VERSION + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" + +# 1. Voice with pauses between groups +SPACED=$(echo "$MESSAGE" | sed 's/\([A-Z]\{5\}\)/\1 /g') +TEXT_TO_SPEAK="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}. ${SPACED}" + +echo "$TEXT_TO_SPEAK" | espeak-ng -ven+f3 -s76 -k60 -a 210 -w voice.wav --punct="" 2>/dev/null +echo "✅ Voice created" + +# 2. Mix tune + voice + static in simple steps +echo "Mixing audio..." + +# Tune + static +ffmpeg -i poacher_intro.wav -i static.wav -filter_complex "[0:a][1:a]amix=inputs=2:duration=first" -c:a pcm_s16le -y tune_static.wav -y 2>/dev/null + +# Append voice after tune +ffmpeg -i tune_static.wav -i voice.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +echo "✅ Final audio ready ($(du -h final_audio.wav | cut -f1))" + +# 3. Video +DUR=42 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DUR -c:v libx264 -t $DUR -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f voice.wav tune_static.wav temp_bg.mp4 + +echo "✅ DONE! → ${OUTFILE}" +echo "Play it and enjoy the full numbers-station experience." diff --git a/scripts/nerdletter_numbers_station_poacher9.sh b/scripts/nerdletter_numbers_station_poacher9.sh new file mode 100755 index 0000000..42b9b12 --- /dev/null +++ b/scripts/nerdletter_numbers_station_poacher9.sh @@ -0,0 +1,55 @@ + +#!/bin/bash +# NERDLETTER NUMBERS STATION — MAXIMUM RELIABILITY VERSION + +MESSAGE="$1" +PAGE="$2" +EPISODE="${3:-01}" +OUTFILE="nerdletter_secret_${EPISODE}_page${PAGE}.mp4" + +echo "=== NERDLETTER SECRET TRANSMISSION #${EPISODE} ===" + +# 1. Build voice by speaking each letter individually + long pauses between groups +VOICE_TEXT="NERDLETTER SECRET MESSAGE ${EPISODE}. USE DAY BOOK PAGE ${PAGE}." +echo "$VOICE_TEXT" | espeak-ng -ven+f3 -s78 -k60 -a 200 -w intro_voice.wav --punct="" 2>/dev/null + +# Add each group letter-by-letter with pauses +for group in $MESSAGE; do + for ((i=0; i<${#group}; i++)); do + letter="${group:$i:1}" + echo "$letter" | espeak-ng -ven+f3 -s72 -k70 -a 210 -w temp_letter.wav --punct="" 2>/dev/null + cat temp_letter.wav >> groups_voice.wav + rm -f temp_letter.wav + done + # 1-second pause after each group + ffmpeg -f lavfi -i "anullsrc=r=22050" -t 1.0 silence.wav -y 2>/dev/null + cat silence.wav >> groups_voice.wav + rm -f silence.wav +done + +# Combine intro + groups +ffmpeg -i intro_voice.wav -i groups_voice.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -c:a pcm_s16le -y voice.wav 2>/dev/null + +echo "✅ Voice track built letter-by-letter with pauses" + +# 2. Mix with tune + static +ffmpeg -i poacher_intro.wav -i static.wav -filter_complex "[0:a][1:a]amix=inputs=2:duration=first" -c:a pcm_s16le -y tune_static.wav 2>/dev/null + +ffmpeg -i tune_static.wav -i voice.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -c:a pcm_s16le -y final_audio.wav 2>/dev/null + +# 3. Video +DUR=45 +ffmpeg -f lavfi -i color=black:s=1280x720:d=$DUR -c:v libx264 -t $DUR -pix_fmt yuv420p temp_bg.mp4 -y + +ffmpeg -i temp_bg.mp4 -i final_audio.wav \ +-vf "drawtext=font='Courier':fontsize=50:fontcolor=green@0.95:text='NERDLETTER SECRET TRANSMISSION #${EPISODE}':x=(w-text_w)/2:y=80, \ +drawtext=font='Courier':fontsize=36:fontcolor=green@0.85:text='USE DAY BOOK PAGE ${PAGE}':x=(w-text_w)/2:y=170, \ +drawtext=font='Courier':fontsize=44:fontcolor=lime@0.95:text='${MESSAGE}':x=(w-text_w)/2:y=270:box=1:boxcolor=black@0.75:boxborderw=15, \ +drawtext=font='Courier':fontsize=30:fontcolor=green@0.75:text='DESTROY PAGE AFTER USE — SUBSCRIBERS ONLY':x=(w-text_w)/2:y=640" \ +-c:v libx264 -c:a aac -shortest "$OUTFILE" -y + +# Cleanup +rm -f intro_voice.wav groups_voice.wav tune_static.wav temp_bg.mp4 + +echo "✅ DONE! → ${OUTFILE}" +