質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Swift

    7045questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iPhone

    963questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

swift マイク入力された音データの周波数や音量を取得・分析するコード

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,158

ddk

score 2

前提・実現したいこと

swiftでiphoneのマイクから入力された音データをリアルタイムで取得・分析したいです。
音の周波数ごとの音量が検知できるコードがお分かりでしたら教えて頂きたいです。

現状は以下のソースコードでAudioQueueInputCallbackが呼び出され、inBufferに音データが収まっている様ですが、取り出し方法がわかりません。

swiftについては初心者ですので、勘違いしている箇所もあると思いますが、よろしくお願いいたします。

該当のソースコード

import AudioToolbox
import UIKit
private func AudioQueueInputCallback(
    _ inUserData: UnsafeMutableRawPointer?,
    inAQ: AudioQueueRef,
    inBuffer: AudioQueueBufferRef,
    inStartTime: UnsafePointer<AudioTimeStamp>,
    inNumberPacketDescriptions: UInt32,
    inPacketDescs: UnsafePointer<AudioStreamPacketDescription>?)
{

    /* ここでマイク入力されたデータを扱いたい*/
    print(inBuffer);    //???

}

class ViewController: UIViewController {

    var queue: AudioQueueRef!
    var audioQueue: AudioQueueRef? = nil
    var timer: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.startUpdatingVolume()
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.stopUpdatingVolume()
    }

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

    func startUpdatingVolume() {
        var dataFormat = AudioStreamBasicDescription(
            mSampleRate: 44100.0,
            mFormatID: kAudioFormatLinearPCM,
            mFormatFlags: AudioFormatFlags(kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked),
            mBytesPerPacket: 2,
            mFramesPerPacket: 1,
            mBytesPerFrame: 2,
            mChannelsPerFrame: 1,
            mBitsPerChannel: 16,
            mReserved: 0)
        var error = noErr

        self.audioQueue = self.queue;
        error = AudioQueueNewInput(
            &dataFormat,
            AudioQueueInputCallback,
            UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()),
            .none,
            .none,
            0,
            &self.audioQueue)

        if error == noErr {
            self.queue = audioQueue
            var bu :AudioQueueBufferRef?;
            AudioQueueAllocateBuffer(self.queue, 16000, &bu)    //16000は何の値かは不明です
            AudioQueueEnqueueBuffer (self.queue, bu!, 0, nil)
        }

        AudioQueueStart(self.queue, nil)

        self.timer = Timer.scheduledTimer(timeInterval: 1.0,
                                          target: self,
                                          selector: #selector(ViewController.detectVolume(_:)),
                                          userInfo: nil,
                                          repeats: true)
        self.timer?.fire()
    }

    func stopUpdatingVolume()
    {
        self.timer.invalidate()
        self.timer = nil
        AudioQueueFlush(self.queue)
        AudioQueueStop(self.queue, false)
        AudioQueueDispose(self.queue, true)
    }

    func detectVolume(_ timer: Timer)
    {


    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/09/29 10:48

    「inBufferに音データが収まっているよう」とのことですが、音データというのはどのように表現されているデータなのかご存知でしょうか?まずはその辺りをご確認されることをお勧めします。ググれば参考となるページは出てくると思いますが、音声をどのように表現しているのか、周波数とサンプリングレートはどのような関係があるのかなどを理解できるとよりコード自体の理解も深まるかと思います。ちなみにコードは```で囲っていただけるとありがたいです。

    キャンセル

  • ddk

    2017/09/29 11:56

    プログラムを```で囲む方法は知りませんでした。ご指摘ありがとうございます。音データの中身はどの様に表現されたデータは理解できませんでした。推測では音のチャンネル毎に音量、周波数、音色などが数値で表され、inBuffer内のどれかの配列に収まっているのだろうと推測しています。

    キャンセル

回答 1

0

過去に類似の質問があるようですが確認しましたでしょうか。

この質問にある回答内でどのように取得できるか記述されています。

また、GitHubをMicrophoneやAudioで検索すると、様々な参考になるリポジトリが見つかると思います。

  • https://github.com/search?l=Swift&q=Microphone&type=Repositories&utf8=%E2%9C%93
  • https://github.com/search?l=Swift&q=Audio+&type=Repositories&utf8=%E2%9C%93

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/17 21:45

    ご回答ありがとうございます。リンクを参考にしてみたのですが、やはり理解することができませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Swift 取得したNSDateどうしの差分の取得

    Swift2 : NSTimerをバックグラウンドで10分以上の動作 上記質問の、 バックグラウンドに移行したタイミングの時間と、  アプリを再度動作させた時の時間を計算して、 

  • 解決済

    Swift NSTimer利用でのエラー

    前提・実現したいこと swiftでNSTimerを使って簡単なプログラムを書いています。 発生している問題・エラーメッセージ NSTimerが動かない ``` エラー

  • 解決済

    swift3.0でAPIを使いたい

    xcode8でswift3.0を勉強している初心者です。 swift3.0のバージョンアップに伴い、既存のテキストやサンプルコードが一部変更され、 もともとのコードもわからない

  • 解決済

    iOSのCoreMotionでdeviceMotionUpdateIntervalを動的に変えたい

    こちらのページ等を参考にswiftで加速度情報を取得するアプリを作成しております。 取得することは出来たのですが、取得間隔を動的に変えたいと考えております。上記ウェブサイトで

  • 解決済

    SwiftでViewController間のdelegateをする方法

    前提・実現したいこと SwiftでViewController間でdelegateをしようと思ってるいるのですが、うまく行きません。 コードでは、SecondViewContr

  • 解決済

    textFieldのキーボードが閉じれない

    swiftでボタンがタップされたらxibファイルで作成したviewを表示し、そこにあるtextfieldの入力が終了したら表示をやめる処理を書きたいです。 タップされたら表示される

  • 受付中

    segueで繋いでしまったが、画面遷移前にポップアップを出したい

    画面遷移の前にポップアップを出したいのです。(はいを選択したら次のページに進むような形にしたいです) ですが、すでにドラックアンドドロップでsegueで両画面を繋いでしまっています

  • 解決済

    swift:UITabBarに設定したViewControllerにコードで画面遷移したい

    iOS開発の初心者です。 【UIKit】UITabBarの使い方 こちらのブログの方法を丸写しで、Storyboardを使わないでUITabBarで画面遷移できるようにしました。

同じタグがついた質問を見る

  • Swift

    7045questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iPhone

    963questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。