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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

4回答

14364閲覧

マイクから拾ったデータを波形データに変換するには

Jidousya_364

総合スコア43

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

2クリップ

投稿2017/02/18 02:23

編集2017/02/24 10:51

Swiftでマイクから拾った音を波形データに変換するさせるにはどうすればよいのでしょうか。

現在私がやっているのはAudioToolboxを使って、マイクからデータを拾うもので波型データを得る方法が調べてもSwift3で使えそうなサンプルが見つかりませんでした。

※追記
私がやろうとしているのはマイクから取得したデータをリアルタイムにFFTしたいと考えています

import UIKit
import AudioToolbox

private func AudioQueueInputCallback(
_ inUserData: UnsafeMutableRawPointer?,
inAQ: AudioQueueRef,
inBuffer: AudioQueueBufferRef,
inStartTime: UnsafePointer<AudioTimeStamp>,
inNumberPacketDescriptions: UInt32,
inPacketDescs: UnsafePointer<AudioStreamPacketDescription>?)
{
print(inBuffer) //出力されない
//ここが音声データ? 出力されない
}

class AudioViewController: UIViewController {

@IBOutlet weak var loudLabel: UILabel! @IBOutlet weak var peakTextField: UITextField! @IBOutlet weak var averageTextField: UITextField! var queue: AudioQueueRef! 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() // Dispose of any resources that can be recreated. } // MARK: - Internal methods func startUpdatingVolume() { // Set data format 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) // Observe input level var audioQueue: AudioQueueRef? = nil var error = noErr error = AudioQueueNewInput( &dataFormat, AudioQueueInputCallback,//充填完了時に呼ばれる? UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()), .none, .none, 0, &audioQueue) if error == noErr { self.queue = audioQueue } AudioQueueStart(self.queue, nil) // Enable level meter var enabledLevelMeter: UInt32 = 1 AudioQueueSetProperty(self.queue, kAudioQueueProperty_EnableLevelMetering, &enabledLevelMeter, UInt32(MemoryLayout<UInt32>.size)) self.timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(AudioViewController.detectVolume(_:)), userInfo: nil, repeats: true) self.timer?.fire() } func stopUpdatingVolume() { // Finish observation self.timer.invalidate() self.timer = nil AudioQueueFlush(self.queue) AudioQueueStop(self.queue, false) AudioQueueDispose(self.queue, true) } func detectVolume(_ timer: Timer) { // Get level var levelMeter = AudioQueueLevelMeterState() var propertySize = UInt32(MemoryLayout<AudioQueueLevelMeterState>.size) AudioQueueGetProperty( self.queue, kAudioQueueProperty_CurrentLevelMeterDB, &levelMeter, &propertySize) // Show the audio channel's peak and average RMS power. self.peakTextField.text = "".appendingFormat("%.2f", levelMeter.mPeakPower) self.averageTextField.text = "".appendingFormat("%.2f", levelMeter.mAveragePower) // Show "LOUD!!" if mPeakPower is larger than -1.0 self.loudLabel.isHidden = (levelMeter.mPeakPower >= -1.0) ? false : true }

}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

私も動作の確認をする必要があったので色々試しましたが、audio queue servicesでも音声のバッファを取得することはできましたよ。設定したAudioQueueInputCallbackに定期的にバッファが返ってきます。
参照されている記事のやり方だと必要な処理が足りないので動作していませんでした。

投稿2017/08/17 08:28

duleuze

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

AppleのサンプルコードにaurioTouchという、
CoreAudioを使いマイク入力をFFTしOpenGLで描画するものがあります。
こちらはそのサンプルコードをObjCからswift3に移植したものです。

https://github.com/ooper-shlab/aurioTouch2.0-Swift

投稿2017/02/21 13:04

pebble8888

総合スコア390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jidousya_364

2017/02/25 03:18

audioTouchを見させてもらいましたが、すいません自分では理解できませんでした。 func performRender( _ ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, inTimeStamp: UnsafePointer<AudioTimeStamp>, inBufNumber: UInt32, inNumberFrames: UInt32, ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus { のioDataにマイクで撮った音の情報が入っているという認識でよろしいのでしょうか
pebble8888

2017/02/26 01:13

ソースコメントを読んでいただければ分かりますが、その中のAudioUnitRender呼び出しでマイクの音を取得しています。
guest

0

http://krr.blog.shinobi.jp/javafx_praxis/java%E3%81%A7%E9%9F%B3%E5%A3%B0%E6%B3%A2%E5%BD%A2%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
イメージとしては上記ページが参考になるかと思います。

データを取得するには、参考とされているソースの元記事ページに記載されている通り、
AudioInputCallback を設定する必要があります。
http://blog.koogawa.com/entry/2016/04/17/133052

投稿2017/02/21 09:17

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

波形データって、マイクから拾って取得した音声データのことじゃないんですか?
現在どんなコードでマイクからデータを拾っているかコードを提示して、
どんなデータを得たいか具体的に説明すれば、何かアドバイスできるかもしれません。

投稿2017/02/19 18:22

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jidousya_364

2017/02/21 08:11

https://github.com/koogawa/iSensorSwift/blob/master/iSensorSwift/Controller/AudioViewController.swift こちらを参考にAudioqueueを利用して、マイクからデータを取得しようとしています。 マイク自体の動作はできているのですが、マイクから得たデータをどこから取得するかなどが理解できないので曖昧な説明で申し訳ございません どんなデータを得たいのかは http://kitten-ear.hatenablog.com/entry/2015/05/06/161024 こちらのサイトの for var i = 0; i < samplingHz; i++ { inputData[i] = sin((freq / Float(samplingHz)) * Float(i) * 2.0 * Float(M_PI)) } のような、Float型の数値の配列を取得したいと考えています
TakeOne

2017/02/21 15:26

マイクから得たデータの取得方法がわからないということですね。 https://github.com/koogawa/iSensorSwift/blob/master/iSensorSwift/Controller/AudioViewController.swift このソースコードだと、12行目のAudioQueueInputCallbackという関数で マイクから得たデータを取得でき、それが波形データになります。 現在は // Do nothing, because not recoding. というコメントで、「録音しないから何もしない」 とだけ書かれていますね。 AudioQueueの使い方をきちんと調べることをお勧めします。
Jidousya_364

2017/02/23 10:06

何度もすいません AudioQueueInputCallbackの中の // Do nothing, because not recoding.  の部分にprint文でiodateなどを出力させたのですが、何も表示されず 自分で調べてみたりもしたのですがioDataなどが何を意味しているのか理解できませんでした クレクレくんのようなことで申し訳ないのですが、至急、教えて下さらないでしょうか
TakeOne

2017/02/23 14:52

ioDataというのがどこから出てきたものかわかりませんが、 AudioQueueInputCallbackの呼び出しパラメータの説明は Googleで「AudioQueueInputCallback」を検索すれば出てきます。 https://developer.apple.com/reference/audiotoolbox/audioqueueinputcallback その中でAudioQueueBufferRefのinBufferに音声データが入っています。 inBufferをSwiftでどのように参照したらいいかは http://tiny-wing.hatenablog.com/entry/2016/05/22/010902 が参考になると思います。 この記事より、 inBuffer.memory.mAudioDataByteSize でデータサイズを取得でき、 inBuffer.memory.mAudioData でデータ内容を取得できることがわかると思います。 ただ、この記事はSwift2用なので、Swift3だとおそらく memoryでなくpointeeに変更しろと言われると思います。
Jidousya_364

2017/02/24 10:48

inBufferの参照方法を見てみたのですが理解できませんでした。すみません。 コードの方を追加しますので、見てくださると嬉しいです inBufferの参照方法がよくわかりませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問