Audio Kit iOS Определение высоты тона / частоты коротких микрофонных входов, таких как касания - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать приложение, в котором пользователь может записать небольшой аудиоклип - или звук в реальном времени с микрофона и издавать короткий шум, например, постукивание.Затем приложение анализирует частоту или высоту звука, чтобы запомнить это позже.

Я натолкнулся на удивительный фреймворк под названием Audio kit, и, похоже, у него действительно хороший пример приложения, который, по крайней мере, поможет мне начать работу.http://audiokit.io/examples/MicrophoneAnalysis/

Однако, если запустить, это не даст мне полезных результатов для коротких звуков, например, нажатие на стол против хлопка.

Я ценю этот пример больше для определения вокальной или музыкальной высоты -

func setupPlot() {
    let plot = AKNodeOutputPlot(mic, frame: audioInputPlot.bounds)
    plot.plotType = .rolling
    plot.shouldFill = true
    plot.shouldMirror = true
    plot.color = UIColor.blue
    audioInputPlot.addSubview(plot)
}

override func viewDidLoad() {
    super.viewDidLoad()

    AKSettings.audioInputEnabled = true
    mic = AKMicrophone()
    tracker = AKFrequencyTracker(mic)
    silence = AKBooster(tracker, gain: 0)
}
@objc func updateUI() {
        if tracker.amplitude > 0.1 {
        frequencyLabel.text = String(format: "%0.1f", tracker.frequency)

        var frequency = Float(tracker.frequency)
        while frequency > Float(noteFrequencies[noteFrequencies.count - 1]) {
            frequency /= 2.0
        }
        while frequency < Float(noteFrequencies[0]) {
            frequency *= 2.0
        }

        var minDistance: Float = 10_000.0
        var index = 0

        for i in 0..<noteFrequencies.count {
            let distance = fabsf(Float(noteFrequencies[i]) - frequency)
            if distance < minDistance {
                index = i
                minDistance = distance
            }
        }
        let octave = Int(log2f(Float(tracker.frequency) / frequency))
        noteNameWithSharpsLabel.text = "\(noteNamesWithSharps[index])\(octave)"
        noteNameWithFlatsLabel.text = "\(noteNamesWithFlats[index])\(octave)"
    }
    amplitudeLabel.text = String(format: "%0.2f", tracker.amplitude)
}

Я проверил на сайте аудио комплекта и посоветовал размещать здесь вопросы с соответствующим тегом

Итак, мой вопрос - возможно ли сделать это с помощью каркаса - в идеале достаточно точно определить частоту короткого фрагмента звука, чтобы различать два громких удара (например, кто-то хлопает себя по груди, а затем по бедру)

Или есть альтернативные фреймворки, на которые мне следует взглянуть (я разработчик для iOS)

1 Ответ

0 голосов
/ 25 мая 2018

Первое, что нужно сделать, это определить, существует ли статистически значимая разница между звуками двух типов ударов.

Вы можете записать несколько образцов каждого, а затем исследовать их с помощью инструмента анализа звука, такого как спектрограмма, используя Audacity или MatLab.Тогда вы сможете найти какую-то конкретную структуру, которая сможет надежно обнаружить любую разницу, которую вы обнаружили, если это возможно.Или, если вы можете собрать тысячи помеченных звуковых образцов, вы сможете передать их в какой-то инструмент глубокого обучения и использовать результаты с помощью iOS MLKit для вывода.

...