I know that renderstepped makes a delay, but for some reason, this script likes to pause the odd time when the players speed drops.
Character = game.Players.LocalPlayer.Character
local Delta = 0.05
local Recoil = 0
local Timer = 0
local Last = Character.Torso.Position
local CustomAnim = false
game:GetService("RunService").RenderStepped:connect(function()
local Speed = (Character.Torso.Position - Last).magnitude * Delta
local Multiplier = Aiming and 0.02 or 0.05
local LastSpeed = 0
print(Speed)
LastSpeed = Speed
Timer = Timer + Speed
local a = math.sin(Timer * 12) * Multiplier
local av = Vector3.new(a * 2.5, math.abs(a * 1.5), 0)
if Speed == 0 or Speed == 0.1 then
print('Triggered')
a = 0
av = Vector3.new(0,0,0)
end
--camera.CoordinateFrame = CFrame.new(camera.Focus.p) * (camera.CoordinateFrame - camera.CoordinateFrame.p) * CFrame.Angles(a/10, a/10, a/10) * CFrame.new(0, 0, (camera.Focus.p - camera.CoordinateFrame.p).magnitude)
game.Workspace.Camera.Arms.Torso.Head.C1 = (CFrame.new(0, -1.5, 0) + av) * CFrame.Angles(-a/5, a/5, 0) * CFrame.new(0, 0, Recoil)
Mouse.TargetFilter = workspace
Character.Torso.Neck.C1 = CFrame.new()
Character.Torso.Neck.C0 = CFrame.new(0, 1.5, 0) * CFrame.Angles(math.asin((Mouse.Hit.p - Mouse.Origin.p).unit.y), 0, 0)
Last = Character.Torso.Position
end)

2 comments
The .RenderStepped event fires each time right before the next frame renders, wich depends on your FPS.
RenderStepped prevents the next frame from rendering. Use heartbeat if it must be a 60hz loop but if you need to do camera movement, use a renderstepped loop, Just use them both sparingly.