gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:25:00 25 4
gpt4 key购买 nike

嘿,我正在做一个项目(速度很快),它比较两个音频信号并测量正确性。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com