Post

Replies

Boosts

Views

Activity

Help with Shazam
am trying to identify songs using shazamkit. every time it runs, this is the output: 2023-04-26 04:39:28.947059-0400 shazoom[38003:3098314] [AQ] AudioQueueObject.cpp:2364 Error (-4) getting reporterIDs Processing chunk 1 from 0.0 to 60.0: 4316113920 Chunk saved at: file:///Users/youssefhemimy/Downloads/beyoncee.mp3 No match found 2023-04-26 04:39:29.483659-0400 shazoom[38003:3098339] [AQ] AudioQueueObject.cpp:2364 Error (-4) getting reporterIDs Processing chunk 2 from 60.0 to 120.0: 4317271680 Chunk saved at: file:///Users/youssefhemimy/Downloads/beyoncee.mp3 No match found 2023-04-26 04:39:29.965718-0400 shazoom[38003:3098343] [AQ] AudioQueueObject.cpp:2364 Error (-4) getting reporterIDs Processing chunk 3 from 120.0 to 180.0: 4317324608 Chunk saved at: file:///Users/youssefhemimy/Downloads/beyoncee.mp3 No match found Note: all songs I have used have been identified by shazam the app. I have tried to use different songs, re-exported them from logic pro x but no luck. It also takes less than 2 seconds to generate this output which is way faster than the app. I have tried to use: var minimumQuerySignatureDuration: TimeInterval { get } but no luck. Below is the full code: import Foundation import AVFoundation import ShazamKit class ShazamAnalyzer: NSObject, SHSessionDelegate { let session = SHSession() func analyzeAudioFile(url: URL) { let asset = AVAsset(url: url) let assetDuration = asset.duration.seconds let chunkDuration = 30.0 let numberOfChunks = Int(ceil(assetDuration / chunkDuration)) session.delegate = self for i in 0..<numberOfChunks { let startTime = Double(i) * chunkDuration let start = CMTime(seconds: startTime, preferredTimescale: asset.duration.timescale) let end = CMTime(seconds: min(startTime + chunkDuration, assetDuration), preferredTimescale: asset.duration.timescale) let range = CMTimeRange(start: start, end: end) if let signature = generateSignature(from: asset, for: range) { print("Processing chunk &bsol;(i + 1) from &bsol;(start.seconds) to &bsol;(end.seconds): &bsol;(signature.hash)") print("Chunk saved at: &bsol;(url.absoluteString)") session.match(signature) } else { print("Error generating signature for chunk &bsol;(i + 1)") } } } func generateSignature(from asset: AVAsset, for timeRange: CMTimeRange) -> SHSignature? { let audioFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 1) let signatureGenerator = SHSignatureGenerator() let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetPassthrough)! exportSession.timeRange = timeRange let reader = try? AVAssetReader(asset: exportSession.asset) let audioOutput = AVAssetReaderAudioMixOutput(audioTracks: exportSession.asset.tracks(withMediaType: .audio), audioSettings: nil) audioOutput.alwaysCopiesSampleData = false reader?.add(audioOutput) reader?.startReading() while let sampleBuffer = audioOutput.copyNextSampleBuffer() { if let blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer) { let length = CMBlockBufferGetDataLength(blockBuffer) var data = Data(count: length) _ = data.withUnsafeMutableBytes {(bytes: UnsafeMutableRawBufferPointer) in CMBlockBufferCopyDataBytes(blockBuffer, atOffset: 0, dataLength: length, destination: bytes.baseAddress!) } let audioBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat!, frameCapacity: AVAudioFrameCount(length) / audioFormat!.streamDescription.pointee.mBytesPerFrame)! guard let channelData = audioBuffer.floatChannelData else { print("Error: Channel data is nil") return nil } let channels = UnsafeBufferPointer(start: channelData, count: Int(audioFormat!.channelCount)) let destinationBuffer = UnsafeMutableBufferPointer(start: channels[0], count: length) _ = data.copyBytes(to: destinationBuffer) do { try signatureGenerator.append(audioBuffer, at: nil) } catch { print( "Error appending buffer to signature generator: &bsol;(error)") return nil } } } return signatureGenerator.signature() } func session(_ session: SHSession, didFind match: SHMatch) { if let matchedItem = match.mediaItems.first { print("Match found: &bsol;(matchedItem.title ?? "Unknown Title") by &bsol;(matchedItem.artist ?? "Unknown Artist")") } else { print("Match found, but unable to retrieve media item details.") } } func session(_ session: SHSession, didNotFindMatchFor signature: SHSignature, error: Error?) { print("No match found") } } let filePath = "/Users/youssefhemimy/Downloads/beyoncee.mp3" // Replace this with the actual path to your audio file if let fileURL = URL(string: "file://" + filePath) { let analyzer = ShazamAnalyzer() analyzer.analyzeAudioFile(url: fileURL) } else { print("Invalid file path") }
0
0
595
Apr ’23