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

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

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

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

Q&A

解決済

2回答

3727閲覧

音声認識について理解できない概念があります

fromKennya

総合スコア16

Swift

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

0グッド

0クリップ

投稿2017/05/20 05:00

###inputNodeとは?
音声認識のサンプルコードをアップルの公式サイトからダウンロードして勉強をしているのですが,
inputNodeという概念が理解できません。

###該当のソースコード

private func startRecording() throws { // Cancel the previous task if it's running. if let recognitionTask = recognitionTask { recognitionTask.cancel() self.recognitionTask = nil } let audioSession = AVAudioSession.sharedInstance() try audioSession.setCategory(AVAudioSessionCategoryRecord) try audioSession.setMode(AVAudioSessionModeMeasurement) try audioSession.setActive(true, with: .notifyOthersOnDeactivation) recognitionRequest = SFSpeechAudioBufferRecognitionRequest() guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") } guard let recognitionRequest = recognitionRequest else { fatalError("Unable to created a SFSpeechAudioBufferRecognitionRequest object") } // Configure request so that results are returned before audio recording is finished recognitionRequest.shouldReportPartialResults = true // A recognition task represents a speech recognition session. // We keep a reference to the task so that it can be cancelled. recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in var isFinal = false if let result = result { self.textView.text = result.bestTranscription.formattedString isFinal = result.isFinal } if error != nil || isFinal { self.audioEngine.stop() inputNode.removeTap(onBus: 0) self.recognitionRequest = nil self.recognitionTask = nil self.recordButton.isEnabled = true self.recordButton.setTitle("Start Recording", for: []) } } let recordingFormat = inputNode.outputFormat(forBus: 0) inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in self.recognitionRequest?.append(buffer) } audioEngine.prepare() try audioEngine.start() textView.text = "(Go ahead, I'm listening)" }

###上記のソースコードではどんな動きをしている?
公式リファレンスでinputNodeの定義を読みましたが、nodeの理解ありきで説明がされているので理解できませんでした。
上記のソースコードではどんな動きをしているのでしょうか?

###URL
https://developer.apple.com/library/content/samplecode/SpeakToMe/Listings/SpeakToMe_ViewController_swift.html#//apple_ref/doc/uid/TP40017110-SpeakToMe_ViewController_swift-DontLinkElementID_6

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

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

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

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

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

guest

回答2

0

AVAudio engineの入力のノードです。このコードのようにaudioEngine.inputNodeと書くとデフォルトの音声入力(iOSではマイク)から入力が入ってきます。
認識処理については使ったことがないので詳しいことはわかりませんが、コードを見るとそれらの準備をした後でマイクからの入力はinputNode.installTapで指定された処理にbufferサイズ単位でbufferを通じてPCM形式で渡されてその中の処理で認識処理に渡されるということになっているようです。

投稿2017/05/20 23:02

osanpo

総合スコア13

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

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

fromKennya

2017/06/03 04:09

ありがとうございます。 一通りの流れは理解することができました!
guest

0

ベストアンサー

ソースをなんとなく眺めて思ったのは、計算機内部に用意されているAudioEngine(音声の制御をするソフトウェアモジュール)に用意されている「音声入力用の端子」のようなものに思えました。

要するにハードウェアになぞらえるならレコーダーに備わっているマイク端子のようなものだと思えました。

API referenceをみると

AVAudioNode

The AVAudioNode class is an abstract class for an audio generation, processing, or I/O block.

つまり「音声データを生成したり(マイク入力端子のようなもの)、処理したり(イヤホンジャックのように音声データを実際の音声に変換したりするようなもの)ということですよね。

inputNodeってAVAutioNodeですよね?

投稿2017/05/20 05:27

編集2017/05/20 05:30
KSwordOfHaste

総合スコア18394

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

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

fromKennya

2017/06/03 04:08

BAが遅れてしまい、申し訳ございませんでした。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問