睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)
生活随笔
收集整理的這篇文章主要介紹了
睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 結構體
此部分定義了兩個結構體用于存儲音頻信息:
- AudioFragment:用于存儲單個音頻片段(0.975s, 16000Hz)的標簽評分信息;
- AudioInfo:用于存儲整個音頻信息,包含音頻文件名、時間等基礎信息,同時包含每個時間段的標簽評分信息,即AudioFragment數組。
1.1 AudioFragment 結構體
- 屬性 snoring : Float; 存儲打鼾對應的預測評分,例如 0.9821
- 屬性 sneeze : Float; 存儲打噴嚏對應的預測評分,例如 0.0
- 屬性 cough : Float; 存儲咳嗽對應的預測評分,例如 0.0
- 屬性 topN : Array<(label: String, score: Float)>; 存儲N個標簽與對應評分信息,例如存一個標簽: [(label: “Snoring”, score: 0.9821)]
- 方法init(topN:Array<(label: String, score: Float)>, cough: Float, sneeze: Float, snoring: Float); 有參構造函數,實現對結構體屬性的賦值。
1.2 AudioInfo 結構體
- 屬性 fileName : String; 存儲音頻文件名,不包括擴展名,例如"audio"
- 屬性 audioTime : Float; 存儲音頻對應時間,例如 10.0
- 屬性 audioChannel : Int; 存儲音頻通道數,例如 1
- 屬性 audioSampleRate : Int; 存儲音頻采樣率,例如 8000
- 屬性 audioSampleBit : Int; 存儲音頻采樣深度,例如 16
- 屬性 audioFragemnts : [AudioFragemnt]; 存儲音頻中包含的音頻片段信息,每 0.975s 為一個音頻片段
- 方法 mutating func setValue (fileName: String, audioTime: Float, audioChannel: Int, audioSampleRate: Int, audioSampleBit: Int, audiofragments: [AudioFragment]) -> (); 賦值函數,實現對結構體屬性的賦值。
2 WavReader 類
該類實現對音頻文件的加載、頭文件解析、采樣點數據讀取等功能。以下為類中的所有方法。
- 方法 init (fileName: String, fileExtention: String);初始化函數,需給定目標音頻文件名與其擴展名
- 方法 private func getURLAndDataByStr (fileName: String);根據提供的目標文件名,加載URL資源并解析,獲取音頻的NSData類型數據數組
- 方法 private func readHead(data: NSData); 根據獲取的NSData解析文件頭,解析為特定的文件頭信息
- 方法 private func readAudioData(data: NSData);根據獲取的NSData解析音頻采樣點信息,解析為特定的Uint16數組
- 方法 private func utilsReadData(data: NSData, startIndex: Int, dataSize: Int, bitDeep: Int) throws -> [Int16];wav文件以chunk塊存儲數據,該方法主要通過下標實現讀取單個chunk塊的數據內容
- 方法 func process();指定各個方法的執行順序,對方法進行封裝,對外暴露 process() 方法。
3 AudioProcesser類
該類實現對Yamnet模型文件的加載、執行預測、不同類型數據的轉換、對音頻文件的解析進行調用,以及對解析到的數據進行結構化操作。
- 方法 init (fileName: String);初始化函數,需給定目標處理音頻文件的文件名(不包含擴展名,默認為 .wav)
- 方法 private func setupInterpreter();初始化 Tensorflow Lite 解釋器
- 方法 private func int16ArrayToData(_ buffer: [Int16]) -> Data;將 [Int16] 轉換為 Data 類型數據,模型接收輸入為 Data 類型
- 方法 private func dataToFloatArray(_ data: Data) -> [Float];將Data數據類型轉換為 [Float] 類型數據,將模型輸出轉換為浮點數組
- 方法 public func start(inputBuffer: [Int16]) -> [Float];調用模型執行預測,并返回模型預測結果
- 方法 func sortByScore(scores: [Float], top: Int) -> Array<(label: String, score: Float)>;將模型輸出的標簽評分結果排序
- 方法 func convertSampleData2Audiofragment(wavReader: WavReader, top: Int);傳入一個WavReader對象,該方法會根據該對象中解析到的音頻采樣信息調用yamnet 進行預測,預測后包裝成 AudioFragmen t數組對象,存儲在 AudioInfo 結構體中
- 方法 func predict ( );對文件解析、模型預測等方法進行封裝,對外只需要調用predict()方法
- 方法 func isCough(audioFragment: AudioFragment) -> Bool;傳入一個AudioFragment結構體,通過其評分信息判斷是否為咳嗽音頻(通過判斷其topN屬性中是否包含Cough標簽)
- 方法 func isSneeze(audioFragment: AudioFragment) -> Bool;傳入一個AudioFragment結構體,通過其評分信息判斷是否為打噴嚏音頻(通過判斷其topN屬性中是否包含Sneeze標簽)
- 方法 func isSnoring(audioFragment: AudioFragment) -> Bool;傳入一個AudioFragment結構體,通過其評分信息判斷是否為打鼾音頻(通過判斷其topN屬性中是否包含Snoring標簽)
總結
以上是生活随笔為你收集整理的睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# wpf 面试_【远程面试】九强通信
- 下一篇: “砸7000万,这样的黑锅我们也不背。”