's probably it. ContentProvider’s PreloadAsync only works in a LocalScript. Preload this from the client instead, preferably under ReplicatedFirst or in whatever client initialisation scripts you may have.
You are capable of preloading the animation data if you don’t want to directly preload the object in the NPC. Somewhat expensive to do, but you create proxy objects and load those, then get rid of them. Here’s an example using only one id.
local ContentProvider = game:GetService("ContentProvider")
local animId = 0
local animForLoad = Instance.new("Animation")
animForLoad.AnimationId = "rbxassetid://" .. animId
ContentProvider:PreloadAsync({animForLoad})
animForLoad:Destroy()