Closed sebacea closed 3 years ago
Since beamer compiles to PDF, then you should be able to PDF → PNG using pdftools::pdf_convert
and then pass the resulting PNG files into images
argument of ari_spin
.
How do you see the "script" embedded in the beamer? In comments or some other notes area? Please reopen if that's clear.
I understood the method in order to narrate beamers presentations. Nevertheless, I did not get the point regarding the embedded script you say.
OK. So your beamer presentation is a PDF. A "script" is a text file with the number of lines equal to the number of slides in the PDF (also empty lines can be in the text file as well).
See example below
library(ari)
library(curl)
library(stringi)
library(pdftools)
#> Using poppler version 0.73.0
example beamer presentation
url = "http://www2.informatik.uni-freiburg.de/~frank/ENG/beamer/example/Beamer-class-example1.pdf"
tdir = tempfile()
dir.create(tdir, recursive = TRUE)
destfile = tempfile(fileext = ".pdf", tmpdir = tdir)
curl::curl_download(url, destfile)
##########################################################
# Convert the PDF into PNGs
# this can be done
##########################################################
# get the number of pages
info = pdftools::pdf_info(destfile)
n_pages = info$pages
images = tempfile(tmpdir = tdir, fileext = "")
images = sprintf("%s_%04.0f.png", images, 1:n_pages)
# converting the PDF to PNGs
out = pdftools::pdf_convert(destfile, filenames = images, dpi = 300)
#> Converting page 1 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0001.png... done!
#> Converting page 2 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0002.png... done!
#> Converting page 3 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0003.png... done!
#> Converting page 4 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0004.png... done!
#> Converting page 5 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0005.png... done!
#> Converting page 6 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0006.png... done!
#> Converting page 7 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0007.png... done!
#> Converting page 8 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0008.png... done!
#> Converting page 9 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0009.png... done!
#> Converting page 10 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0010.png... done!
#> Converting page 11 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0011.png... done!
#> Converting page 12 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0012.png... done!
#> Converting page 13 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0013.png... done!
#> Converting page 14 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0014.png... done!
#> Converting page 15 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0015.png... done!
#> Converting page 16 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0016.png... done!
#> Converting page 17 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0017.png... done!
#> Converting page 18 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0018.png... done!
#> Converting page 19 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431f2805ca/file714347c159dc_0019.png... done!
##########################################################
# Section to create script
# you wouldn't do this in practice
# but actually make a text file with all the narration
# needed for your video.
##########################################################
# here is the script
paragraphs = stringi::stri_rand_lipsum(n_paragraphs = length(out))
script_file = tempfile(fileext = ".txt")
writeLines(paragraphs, script_file)
video = ari::ari_spin(images = images, paragraphs = paragraphs)
#> Warning in pollyHTTP(action = "voices", verb = "GET", query = query, ...):
#> Forbidden (HTTP 403).
#> Warning in structure(out[["Voices"]], NextToken = out[["NextToken"]]): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
#> Consider 'structure(list(), *)' instead.
isTRUE(video)
#> [1] TRUE
video_file = attr(video, "outfile")
video_file
#> [1] "/private/var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T/Rtmpf0uU6s/file714370c27c58.mp4"
ariExtra
Here we use pdf_to_ari
to convert to MD file
####################################################
# You can also use ariExtra
####################################################
res = ariExtra::pdf_to_ari(path = destfile, script_file)
#> Converting PDF to PNGs
#> Converting page 1 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143739ffe80.png... done!
#> Converting page 2 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143cfdc0ce.png... done!
#> Converting page 3 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143677d1b0b.png... done!
#> Converting page 4 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143467aa441.png... done!
#> Converting page 5 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431db5cb8d.png... done!
#> Converting page 6 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143a46a538.png... done!
#> Converting page 7 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143240904cd.png... done!
#> Converting page 8 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71434c1a4136.png... done!
#> Converting page 9 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71434faf6742.png... done!
#> Converting page 10 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71434a446ed.png... done!
#> Converting page 11 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71433d2c73fc.png... done!
#> Converting page 12 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71433172c4c4.png... done!
#> Converting page 13 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714365d43938.png... done!
#> Converting page 14 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71434ff8bfc2.png... done!
#> Converting page 15 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714353f58292.png... done!
#> Converting page 16 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431b4f6a4e.png... done!
#> Converting page 17 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71437acc34e3.png... done!
#> Converting page 18 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714374a46210.png... done!
#> Converting page 19 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714354224443.png... done!
#> Making output_file directories
# open the file and then do rmarkdown::render
html_embedded_with_video = rmarkdown::render(res$output_file)
#> Writing out Wav for audio
#> Sample rate downsampled to 24000
#> '/usr/local/Cellar/ffmpeg/4.3.2_4/bin/ffmpeg' -y -f concat -safe 0 -i '/private/var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T/Rtmpf0uU6s/ari_input_La5ZNro4sGA4.txt' -i '/private/var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T/Rtmpf0uU6s/ari_audio_dTUDGUkOxfsc.wav' -c:v libx264 -c:a aac -ac 2 -shortest -vsync 2 -pix_fmt yuv420p -vf fps=5,"scale=trunc(iw/2)*2:trunc(ih/2)*2" -strict experimental -max_muxing_queue_size 9999 -threads 2 '/private/var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T/Rtmpf0uU6s/file714315afb5dc.mp4'
#> /usr/local/bin/pandoc +RTS -K512m -RTS file714315afb5dc.utf8.md --to html4 --output file714315afb5dc.html
#>
#> Output created: file714315afb5dc.html
if (interactive()) browseURL(html_embedded_with_video)
ariExtra_video_file = sub(".html", ".mp4", html_embedded_with_video)
file.exists(ariExtra_video_file)
#> [1] TRUE
file = "~/Desktop/output_file.mp4"
file.exists(file)
#> [1] FALSE
res = ariExtra::pdf_to_ari(path = destfile, script_file, output = file,
output_file = tempfile(fileext = ".md"))
#> Converting PDF to PNGs
#> Converting page 1 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143333dae43.png... done!
#> Converting page 2 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143167bcafd.png... done!
#> Converting page 3 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143194bb393.png... done!
#> Converting page 4 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714338fa84de.png... done!
#> Converting page 5 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71434729280b.png... done!
#> Converting page 6 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71435f040eac.png... done!
#> Converting page 7 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714335f6ef0.png... done!
#> Converting page 8 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71436e6c504a.png... done!
#> Converting page 9 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714390b62e9.png... done!
#> Converting page 10 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71434a8ab3a2.png... done!
#> Converting page 11 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143581776e9.png... done!
#> Converting page 12 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71436c7fe82d.png... done!
#> Converting page 13 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714341641a01.png... done!
#> Converting page 14 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714312e75931.png... done!
#> Converting page 15 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431290a9a9.png... done!
#> Converting page 16 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714357729fc4.png... done!
#> Converting page 17 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file7143265729b6.png... done!
#> Converting page 18 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file714324737f64.png... done!
#> Converting page 19 to /var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T//Rtmpf0uU6s/file71431ab090ee.png... done!
#> Making output_file directories
different_html = rmarkdown::render(
res$output_file
)
#> Writing out Wav for audio
#> Sample rate downsampled to 24000
#> '/usr/local/Cellar/ffmpeg/4.3.2_4/bin/ffmpeg' -y -f concat -safe 0 -i '/Users/johnmuschelli/Desktop/ari_input_NS8KxuyHA6x4.txt' -i '/Users/johnmuschelli/Desktop/ari_audio_UsOQhUyThilB.wav' -c:v libx264 -c:a aac -ac 2 -shortest -vsync 2 -pix_fmt yuv420p -vf fps=5,"scale=trunc(iw/2)*2:trunc(ih/2)*2" -strict experimental -max_muxing_queue_size 9999 -threads 2 '/Users/johnmuschelli/Desktop/output_file.mp4'
#> /usr/local/bin/pandoc +RTS -K512m -RTS file71433dfb06f2.utf8.md --to html4 --output file71433dfb06f2.html
#>
#> Output created: file71433dfb06f2.html
file.exists(file)
#> [1] TRUE
Created on 2021-05-07 by the reprex package (v2.0.0)
Is there a way to have beamer presentations narrated by ari?