ios - 是否可以在 AKAudioPlayer 上使用 AKAmplitudeTracker 并测量振幅变化?

标签 ios swift audiokit

嘿,我正在做一个项目(速度很快),它比较两个音频信号并测量正确性。 AUDIOKIT pod 用于将来自麦克风(AKAmplitudeTracker)的音频转换为 float 。我试图通过在 AKAudioPlayer 上应用跟踪器来实现相同的方法。我想做的是对源信号和引用信号进行采样,仅将其作为幅度数据获取,然后执行DTW(Dynamic time warping)算法。

有什么方法可以将 AKAudioPlayer 音乐转换为振幅数据吗?是否可以为当前正在播放音乐的 AKAudioPlayer 添加跟踪器?代码如下。我需要一些专家建议,提前致谢,祝您编码愉快。

//
//  Conductor.swift
//  AmplitudeTracker
//
//  Created by Mark Jeschke on 10/3/17.
//  Copyright © 2017 Mark Jeschke. All rights reserved.
//

import AudioKit
import AudioKitUI

// Treat the conductor like a manager for the audio engine.
class Conductor {

// Singleton of the Conductor class to avoid multiple instances of the audio engine

var url:URL?
var fileName:String?
var type:String?

static let sharedInstance = Conductor()
var isPlayingKit:Bool?

var micTracker: AKAmplitudeTracker!
var mp3Tracker: AKAmplitudeTracker!

var player:AKAudioPlayer!
var mic: AKMicrophone!

var delay: AKDelay!
var reverb: AKCostelloReverb!

// Balance between the delay and reverb mix.
var reverbAmountMixer = AKDryWetMixer()

func play(file: String, type: String) -> AKAudioPlayer? {

    let url = Bundle.main.url(forResource: file, withExtension: type)
    let file = try! AKAudioFile(forReading: url!)
    player = try! AKAudioPlayer(file: file)

    if self.isPlayingKit! {
        player.play()
        mp3Tracker = AKAmplitudeTracker(player)
        delay = AKDelay(mp3Tracker)
        delay.time = 0.0
        delay.feedback = 0.0
        delay.dryWetMix = 0.5
        reverb = AKCostelloReverb(delay)
        reverb.presetShortTailCostelloReverb()
        reverbAmountMixer = AKDryWetMixer(delay, reverb, balance: 0.8)
        AudioKit.output = reverbAmountMixer
    }
    else {
        self.isPlayingKit = true
        AudioKit.output = nil
        player.stop()
    }
    return player
}

init() {
    AKSettings.playbackWhileMuted = true
    mic = AKMicrophone()
    print("INIT CONDUCTOR")

    micTracker = AKAmplitudeTracker(mic)
    delay = AKDelay(micTracker)
    delay.time = 0.5
    delay.feedback = 0.1
    delay.dryWetMix = 0.5
    reverb = AKCostelloReverb(delay)
    reverb.presetShortTailCostelloReverb()
    reverbAmountMixer = AKDryWetMixer(delay, reverb, balance: 0.8)
    AudioKit.output = reverbAmountMixer

    isPlayingKit = true
    startAudioEngine()
}

func startAudioEngine() {
    AudioKit.start()
    isPlayingKit = true
    print("Audio engine started")
}

func stopAudioEngine() {
    AudioKit.stop()
    isPlayingKit = false
    print("Audio engine stopped")
}
}

上述方法捕获麦克风的振幅。

下面给出的是我尝试在 AKAudioPlayer 上使用 AKAmplitudeTracker 的位置。

//
//  ViewController.swift
//  AudioBoom
//
//  Created by Alex Babu on 20/06/18.
//  Copyright © 2018 Naico. All rights reserved.
//

 import AudioKit

 class ViewController: UIViewController {

var instantanousAmplitudeData = [Double]()
var timer:Timer?
var timerCount:Int?
let conductor = Conductor.sharedInstance
var player:AKAudioPlayer?

@IBOutlet weak var holderView: UIView!
@IBOutlet weak var equalizer: UILabel!
@IBOutlet weak var percentageLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    timerCount = 0
    playMusicOutlet.layer.cornerRadius = playMusicOutlet.frame.size.height/2
    playMusicOutlet.layer.borderColor = UIColor.cyan.cgColor
    playMusicOutlet.layer.borderWidth = 2.0
    playMusicOutlet.clipsToBounds = true

    musicDTW.layer.cornerRadius = musicDTW.frame.size.height/2
    musicDTW.layer.borderColor = UIColor.cyan.cgColor
    musicDTW.layer.borderWidth = 2.0
    musicDTW.clipsToBounds = true

    holderView.layer.cornerRadius = holderView.frame.size.width/2
    holderView.clipsToBounds = true
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBOutlet weak var playMusicOutlet: UIButton!
@IBAction func playMusic(_ sender: Any) {
    playMusicOutlet.setTitle("Talk now", for: .normal)
    self.equalizer.isHidden = false
    timerCount = 0
    AVAudioSession.sharedInstance().requestRecordPermission({(_ granted: Bool) -> Void in
        if granted {
            print("Permission granted")
            self.timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { [unowned self] (timer) in
                if let count = self.timerCount {
                    DispatchQueue.main.async {
                        self.timerCount = count + 1
                        print("Amplitude of mic detected:\(self.conductor.micTracker.amplitude)")
                        print("Amplitude of mic counter:\(String(describing: count))")

                        print("Amplitude of mp3 detected:\(self.conductor.micTracker.amplitude)")
                        print("Amplitude of mp3 Counter:\(String(describing: count))")

                        self.instantanousAmplitudeData.append(self.conductor.micTracker.amplitude)
                        self.equalizer.frame.size.height = CGFloat(self.conductor.micTracker.amplitude * 500)
                        self.percentageLabel.text = String(Int(((self.conductor.micTracker.amplitude * 500)/500) * 100)) + "%"

                        if count == 10000 {
                            timer.invalidate()
                            self.equalizer.isHidden = true
                        }
                    }
                }
            }
        }
        else {
            print("Permission denied")
        }
    })
}

@IBOutlet weak var musicDTW: UIButton!
@IBAction func musicDTWAction(_ sender: Any) {

    let anotherConductor = Conductor.sharedInstance
    if let ccc = anotherConductor.play(file: "Timebomb", type: "mp3") {
        musicDTW.setTitle("Music DTW on", for: .normal)
        if let mp3Tracker = conductor.mp3Tracker {
            self.equalizer.frame.size.height = CGFloat(mp3Tracker.amplitude * 500)
        }
    }
    else {
        musicDTW.setTitle("Music DTW off", for: .normal)
    }
    }
}

最佳答案

所有这些代码都发生了很多事情,因此很难对其进行调试,但你所描述的绝对是可能的,你可能只是出了一些小问题。或许您可以私下与我分享该代码库,我可以为您修复。

关于ios - 是否可以在 AKAudioPlayer 上使用 AKAmplitudeTracker 并测量振幅变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51055236/

相关文章:

ios - 删除外部存储实体的核心数据不会释放 iCloud 中的空间

ios - 使用 UINavigationController 返回时是否有类似 prepareForSegue 的东西?

ios - 在我设置内容大小并测试它改变后,Scrollview 不滚动

ios - 将 UIPinchGestureRecognizer 缩放级别 Objective C 限制为 Swift 3.0

ios - AudioKit FFT 转换为 dB?

swift - 使用 AKAudioPlayer 播放声音 - iOS

ios - 将图像从 PHAsset 加载到 Imageview

ios - 没有 DispatchQueue.main.async 的意外布局行为

ios - 在 Swift 中创建线程安全数组

ios - AKMicrophone 导致 SIGABRT 错误 - 一个错误?