Why is my music script playing twice after leaving a music zone? I dont understand. Here is the script:

function PartToRegion3(obj)
	local abs = math.abs

	local cf = obj.CFrame -- this causes a LuaBridge invocation + heap allocation to create CFrame object - expensive! - but no way around it. we need the cframe
	local size = obj.Size -- this causes a LuaBridge invocation + heap allocation to create Vector3 object - expensive! - but no way around it
	local sx, sy, sz = size.X, size.Y, size.Z -- this causes 3 Lua->C++ invocations

	local x, y, z, R00, R01, R02, R10, R11, R12, R20, R21, R22 = cf:components() -- this causes 1 Lua->C++ invocations and gets all components of cframe in one go, with no allocations

	-- https://zeuxcg.org/2010/10/17/aabb-from-obb-with-component-wise-abs/
	local wsx = 0.5 * (abs(R00) * sx + abs(R01) * sy + abs(R02) * sz) -- this requires 3 Lua->C++ invocations to call abs, but no hash lookups since we cached abs value above; otherwise this is just a bunch of local ops
	local wsy = 0.5 * (abs(R10) * sx + abs(R11) * sy + abs(R12) * sz) -- same
	local wsz = 0.5 * (abs(R20) * sx + abs(R21) * sy + abs(R22) * sz) -- same
	
	-- just a bunch of local ops
	local minx = x - wsx
	local miny = y - wsy
	local minz = z - wsz

	local maxx = x + wsx
	local maxy = y + wsy
	local maxz = z + wsz
   
	local minv, maxv = Vector3.new(minx, miny, minz), Vector3.new(maxx, maxy, maxz)
	return Region3.new(minv, maxv)
end

local config = game.ReplicatedStorage.YoshiChillMusicConf
local sounds = config.GlobalMusics
wait(5)
local keep = true
spawn(function()
	while wait() do
		local ins
		for _, p in ipairs(config.Zones:GetChildren()) do
			local r3 = PartToRegion3(p)
			for _, part in pairs(workspace:FindPartsInRegion3(r3, nil, math.huge)) do
				
			    local character = false
			    -- In the case the part is a limb
			    if part.Parent:FindFirstChild("Humanoid") then 
			        character = true
				end
			
			    if character then
				
					character = part.Parent
			        local player = game.Players:GetPlayerFromCharacter(character)
					if player and player.Name == game.Players.LocalPlayer.Name then
						--zone music
						keep = false
						print('detected inside')
						ins = true
						wait(2)
						for _, s in ipairs(p.Folder:GetChildren()) do
							local gi = false
							spawn(function()
								repeat wait() if keep then s:Stop() return end until s.IsLoaded
								if  keep then return end
								print('loaded')
								if keep then return end
								s.Looped = false
								if keep then return end
								s.Volume = 0
								if keep then return end	
								s:Play()
								if keep then s:Stop() return end
								game:GetService('TweenService'):Create(s, TweenInfo.new(s.TimeLength/6), {Volume=config.Volume.Value}):Play()
								print('playing')
								if keep then s:Stop() return end
								local target = s.TimeLength - 0.6 * config.Volume.Value - 1
								repeat wait() if keep then s:Stop() return end until s.TimePosition > target
								if keep then s:Stop() return end
								game:GetService('TweenService'):Create(s, TweenInfo.new(s.TimeLength-target), {Volume=0}):Play()
								if keep then s:Stop() return end
								wait(3)
								if keep then s:Stop() return end
								s:Stop()
								gi = true
								if keep then s:Stop() return end
							end)
							repeat wait() if keep then break end until gi == true
							print('ended song')

						end

						break
	
					end
					
					if not ins then keep = true end
			    	end
			if not ins then keep = true end
			end
			if not ins then keep = true end
			
			end
		end

end)
while wait() do

	
	
	for _, s in ipairs(sounds:GetChildren()) do
		local g = false
		spawn(function()
			repeat wait() if not keep then s:Stop() g=true return end until s.IsLoaded
			if not keep then return end
			print('loaded')
			if not keep then return end
			s.Looped = false
			if not keep then return end
			s.Volume = 0
			if not keep then return end	
			s:Play()
			if not keep then s:Stop() g=true return end
			game:GetService('TweenService'):Create(s, TweenInfo.new(s.TimeLength/6), {Volume=config.Volume.Value}):Play()
			if not keep then s:Stop() g=true return end
			local target = s.TimeLength - 0.6 * config.Volume.Value - 1
			repeat wait() if not keep then s:Stop() g=true return end until s.TimePosition > target
			if not keep then s:Stop() g=true return end
			game:GetService('TweenService'):Create(s, TweenInfo.new(s.TimeLength-target), {Volume=0}):Play()
			if not keep then s:Stop() g=true return end
			wait(3)
			if not keep then s:Stop() g=true return end
			s:Stop()
			g = true
			print('ended')
			if not keep then s:Stop() g=true return end
		end)
		repeat wait() if not keep then print('unkeep') break end until g == true
		print('ended twice')
	end
end

Any help would be appreciated!