I'm trying to fix this script up to where it acts as a blizzard and not going slow as it is currently. Here's the whole script.

local SnowLevels = { --[[ <-- Change the amount of snow. ]]--
	["Light"] = false; --[[ <-- Barely any. ]]--
	["Medium"] = false; --[[ <-- Some. ]]--
	["Heavy"] = false; --[[ <-- A respectable amount. :P ]]--
	["Blizzard"] = true; --[[ <-- Reccomended ]]--
}


local imgs = {"rbxassetid://18867938"}

local sp = script.Parent
local r = game:service("RunService")
local players = game:getService("Players")
local sl 
local rate
local vol

if SnowLevels.Light then 
	sl = 45
	vol = 0
elseif SnowLevels.Medium then 
	sl = 70
	vol = 0.10
elseif SnowLevels.Heavy then 
	sl = 95
	vol = 0.30
elseif SnowLevels.Blizzard then 
	sl = 120
	vol = 0.60
end

local q = Instance.new("Part")
	q.Transparency = 1
	q.Anchored = 0
	q.formFactor = Enum.FormFactor.Symmetric
	q.Size = Vector3.new(1, 1, 1)

function projection(vector, camera, size)
  local abs = math.abs
  local result = camera:toObjectSpace(vector)
  vector = result.p
  local rx, ry, rz = result:toEulerAnglesXYZ()
  if vector.z > 0 then return end
  local sizex = size/abs(vector.z)
  local sizey = sizex * abs(math.cos(rx))
  local sizex = sizex * abs(math.cos(ry))
  return -vector.x / vector.z, vector.y * 1.7071067811865 / vector.z, sizex, sizey
end

local face = Enum.NormalId.Bottom

function getdepth(v)
  local t = q:clone()
  t.Parent = workspace
  t.CFrame = CFrame.new(v)
  local s = 2^5
  local n = 1
  for i = 1, 5 do
    s = s * .5
    if t:Resize(face, s) then
      n = n + s
    end
  end
  t:Destroy()
  return n
end

local torso
local flakes = {}

function remove(flake)
  flake[1]:Destroy()
  flakes[flake] = nil
end

function getFlakes(Num)
	for i, v in pairs(flakes) do
		Num = Num+1
	end
	return Num
end

function spriteWork()
	local cz = script.Parent.AbsoluteSize
	local cx, cy = cz.x, cz.y
	for sprite in pairs(flakes) do
		sprite[2] = sprite[2] * CFrame.new(0, -.2, 0) * CFrame.Angles(0, .037699111843078, 0)
		if sprite[2].p.y < sprite[4] then
			sprite[1]:Destroy() sprite:remove()
		end
		local px, py, sx, sy = projection(sprite[2],workspace.CurrentCamera.CoordinateFrame, sprite[3])
		local label = sprite[1]
		if px and sx >= 1 and sy >= 1 then
			label.Visible = true
			label.Size = UDim2.new(0,sx,0,sy)
			label.Position = UDim2.new(0,((px + 1) * cx - sx) * .5,0,((py + 1) * cy - sy) * .5)
		else
			label.Visible = false
		end
	end
end

function spawn(char)
	for flake in pairs(flakes) do
		flake:Destroy()
	end
	while char.Parent do
		if getFlakes(0) < sl-10 then 
			for i = 1, sl-10 do
				r.Stepped:wait()
				if getFlakes(0) < sl-10 then 
					local label = Instance.new("ImageLabel", sp)
  					label.Image = imgs[math.random(1, #imgs)]
  					label.BackgroundTransparency = 1
  					local dx, dz = (math.random() - .5) * 200, (math.random() - .5) * 200
  					local pos = char["Torso"].Position + Vector3.new(dx, (30 - math.random() * 20) * (1 - (dx^2 + dz^2)^.5/(1.4142135623731 * 100)) , dz)
  					local sphr = CFrame.new(Vector3.new(),Vector3.new(math.random()-.5,0,math.random()-.5)) + pos
  					local size = 20 * (math.random() * .75 + .25) * 10
  					local sprite = {label, sphr, size, pos.y - getdepth(pos), remove = remove}
  					local cz = sp.AbsoluteSize
  					local cx, cy = cz.x, cz.y
  					flakes[sprite] = 0
					spriteWork()
				else
					r.Stepped:wait()
					spriteWork()
					break
				end
			end
		else
			r.Stepped:wait()
			spriteWork()
		end
	end
end

repeat wait() until players.LocalPlayer.Character
spawn(players.LocalPlayer.Character)

I'm pretty sure the focus of it is around here.

function getdepth(v)
  local t = q:clone()
  t.Parent = workspace
  t.CFrame = CFrame.new(v)
  local s = 2^5
  local n = 1
  for i = 1, 5 do
    s = s * .5
    if t:Resize(face, s) then
      n = n + s
    end
  end
  t:Destroy()
  return n
end

local torso
local flakes = {}

function remove(flake)
  flake[1]:Destroy()
  flakes[flake] = nil
end

function getFlakes(Num)
	for i, v in pairs(flakes) do
		Num = Num+1
	end
	return Num
end

function spriteWork()
	local cz = script.Parent.AbsoluteSize
	local cx, cy = cz.x, cz.y
	for sprite in pairs(flakes) do
		sprite[2] = sprite[2] * CFrame.new(0, -.2, 0) * CFrame.Angles(0, .037699111843078, 0)
		if sprite[2].p.y < sprite[4] then
			sprite[1]:Destroy() sprite:remove()
		end
		local px, py, sx, sy = projection(sprite[2],workspace.CurrentCamera.CoordinateFrame, sprite[3])
		local label = sprite[1]
		if px and sx >= 1 and sy >= 1 then
			label.Visible = true
			label.Size = UDim2.new(0,sx,0,sy)
			label.Position = UDim2.new(0,((px + 1) * cx - sx) * .5,0,((py + 1) * cy - sy) * .5)
		else
			label.Visible = false
		end
	end
end

function spawn(char)
	for flake in pairs(flakes) do
		flake:Destroy()
	end
	while char.Parent do
		if getFlakes(0) < sl-10 then 
			for i = 1, sl-10 do
				r.Stepped:wait()
				if getFlakes(0) < sl-10 then 
					local label = Instance.new("ImageLabel", sp)
  					label.Image = imgs[math.random(1, #imgs)]
  					label.BackgroundTransparency = 1
  					local dx, dz = (math.random() - .5) * 200, (math.random() - .5) * 200
  					local pos = char["Torso"].Position + Vector3.new(dx, (30 - math.random() * 20) * (1 - (dx^2 + dz^2)^.5/(1.4142135623731 * 100)) , dz)
  					local sphr = CFrame.new(Vector3.new(),Vector3.new(math.random()-.5,0,math.random()-.5)) + pos
  					local size = 20 * (math.random() * .75 + .25) * 10
  					local sprite = {label, sphr, size, pos.y - getdepth(pos), remove = remove}
  					local cz = sp.AbsoluteSize
  					local cx, cy = cz.x, cz.y
  					flakes[sprite] = 0
					spriteWork()
				else
					r.Stepped:wait()
					spriteWork()
					break
				end
			end
		else
			r.Stepped:wait()
			spriteWork()
		end
	end
end

I just don't know what to change and how to do it correctly. If you can just show me how to do so, don't have to write me the code, if you just show me where I need to work on I'd appreciate it!

Here's how the gui works. LINK: http://www.roblox.com/Test-place?id=153890092