Reading and writing the same file in parallel is the culprit.
tempfilename = "temp.mp4" # define a temp filename first
with tqdm(total=frames, desc="Saving", unit="frame") as pbar:
anim.save(tempfilename, fps=fps, progress_callback=lambda i, n: pbar.update(1))
# Add sound using MoviePy
video = VideoFileClip(tempfilename)
video.audio = CompositeAudioClip([AudioFileClip("sound.wav")])
video.write_videofile(filename)
remove(tempfilename) # needs: from os import remove
startfile(filename)