I was inspired by the hard work done by popular YouTubers like dinoflask, and wanted to create a tool for making my own videos in this style. By taking many source clips, people can often make humorous parodies of things people originally said by properly splicing them together to make brand new sentences.
What it does
conjunx allows you to precisely caption source clips and then convert them into your own video mashup simply by typing what you want to have said. Take a look at some of the videos mentioned above to get a better idea.
How I built it
I built conjunx with Docker, docker-compose, Redis, and Python (aiohttp and moviepy). Docker allowed me to divide the project into two major components, the render server, and a web client. The render server accepts jobs involving conjunx project files (.cjxa) and a desired dictation, and will process the result and send back the video. The web client (which could be just as easily swapped out with a desktop client) assists in creating a conjunx project, and provides an easy shortcut for submitting the project to the render server. I am a big fan of aiohttp, along with using Redis for sessions, because it allows for easy asynchronous web server design.
Challenges I ran into
One of the first issues I had was docker-compose failing to attach to the web containers, however this was fixed by setting up gunicorn.
While Python can often be great for quickly spinning up ideas, the maintainability of the project slowly degraded as I implemented more and more parts of it. I tried using the typing library to help some with things, but ultimately had to just do what time allowed.
Trying to figure out how to take the "optimal path" by playing around with linked nodes and such so choosing the best clip when making a dictation proved more confusing than initially expected.
Time constraints also put an additional stress on everything. With a normal project you are given plenty of time to plan and take breaks, but with a time crunch, that's not as easy to do, and can result in some unhealthy decision making, like staying awake way too long and not leaving enough comments.
Accomplishments that I'm proud of
I am proud of how far I was able to make it alone (by choice). It was really satisfying when the first test request to the render server came back finally working!
What I learned
I learned how to work with multipart form data for large files, and how to connect two web servers together (for the rendering). I also gained experience with the super useful moviepy library and aiohttp.
What's next for conjunx
Ideally there would be a fully featured client for captioning and creating project files, possibly even automatically, instead of having to do a lot of the setup by hand. Unfortunately I did not have enough time to implement this. However, due to the separation of the render server from the client, any kind of client could be made to work with the system.
With more time I would also like to develop better demos that what little is showcased below.