一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

了解什么是音高以及歷史上機器學習如何檢測歌曲中的音高

Tensorflowers ? 來源:TensorFlow ? 作者:TensorFlow ? 2020-11-18 17:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

教程的目標:

了解什么是音高 (Pitch) 以及歷史上機器學習如何檢測歌曲中的音高

對歌曲數(shù)據(jù)以及執(zhí)行模型的結(jié)果進行可視化

編寫通過手機麥克風收集聲音的代碼

Android 應(yīng)用程序內(nèi)部部署 ML 模型

對歌曲的數(shù)據(jù)進行轉(zhuǎn)換并使用 SPICE 模型進行推斷

在 Android 手機屏幕上呈現(xiàn)最終結(jié)果

介紹

音高是聲音的一種感知屬性,可以按相應(yīng)的頻率對其進行排序。換句話說,音高在音樂旋律中是用來判斷聲音聽起來“高”和“低”的一種屬性。音高是音調(diào)的主要聽覺屬性之一,其余為音長 (Duration),音強 (Loudness),以及音色 (Timbre)。音高通過頻率進行量化,并以赫茲 (Hz) 為單位進行測量,其中 1Hz 表示每秒一個周期。

音高檢測 (Pitch detection) 一個有趣的挑戰(zhàn)。歷史上,對音高和音高感知的研究一直是心理聲學的核心問題,并且在音頻表征的形成與測試理論、 信號處理算法 (Signal-Processing Algorithms) 以及聽覺系統(tǒng)中的感知等方面起到重要作用。研究人員為此開發(fā)并應(yīng)用了許多技術(shù) ,還努力將相近頻率的背景噪聲與背景音樂進行分離。

技術(shù)
https://www.cs.uregina.ca/Research/Techreports/2003-06.pdf

今天,我們可以通過機器學習來實現(xiàn)這一目標,更具體地說,可以使用 SPICE 模型。這是一個經(jīng)過預(yù)訓(xùn)練的模型,可以識別混合錄制的音頻中的基本音高(包括噪音和背景音樂),您可以在 TensorFlow Hub 獲取 SPICE 模型,包括適用于 Web 端的 TensorFlow.js 以及適用于移動端的 TensorFlow Lite。

TensorFlow Hub

https://tfhub.dev/

TensorFlow.js
https://tfhub.dev/google/tfjs-model/spice/1/default/1

TensorFlow Lite
https://tfhub.dev/google/lite-model/spice/1

開始

音頻以單聲道 16khz 采樣率記錄并保存為 .wav 格式。讓我們用一個具有該格式的簡單音頻文件為例。如果使用對數(shù)頻率坐標圖(以使歌聲更清晰可見),加載它并可視化輸出,我們將獲得一個頻譜圖,該頻譜圖顯示隨時間變化的頻率:

音頻文件
https://storage.googleapis.com/download.tensorflow.org/data/c-scale-metronome.wav

在執(zhí)行帶有歌曲數(shù)據(jù)的模型后,我們將打印模型的輸出。藍色表示模型預(yù)測的音高值,橙色表示這些音高值的置信度:

如果僅保留置信度大于 90% 的結(jié)果,并將其與灰度圖重疊,我們將獲得下圖:

在所有長度的歌曲上準確性都很高??!

需要指出的是,雖然對于上述示例,基于頻譜圖的啟發(fā)式音高提取方法可能也起作用。但是通常情況下,基于機器學習的模型會優(yōu)于手工提取的信號處理方法,特別是當音頻中存在背景噪聲和背景音樂時。關(guān)于 SPICE 與 SWIPE(基于頻譜圖的算法)的比較,請參見此文。

若在 Android 應(yīng)用程序內(nèi)部運行 SPICE 模型,必須使用麥克風收集聲音。首先,我們設(shè)置變量:

private val AUDIO_SOURCE = MediaRecorder.AudioSource.VOICE_RECOGNITION private val SAMPLE_RATE = 16000 private val CHANNEL_MASK = AudioFormat.CHANNEL_IN_MONO private val ENCODING = AudioFormat.ENCODING_PCM_16BIT private val BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_MASK, ENCODING) private val AUDIO_FORMAT = AudioFormat.Builder().setEncoding(ENCODING) .setSampleRate(SAMPLE_RATE) .setChannelMask(CHANNEL_MASK) .build()

然后,選擇 MediaRecorder.AudioSource.VOICE_RECOGNITION 以將麥克風聲源導(dǎo)入至語音識別并應(yīng)用噪聲消除。音頻格式是 16位,單聲道,16KHz 采樣率的理想格式。最后,我們開始錄音進程:

/** * Start the recording process. */ mRecorder = AudioRecord.Builder().setAudioSource(AUDIO_SOURCE) .setAudioFormat(AUDIO_FORMAT) .setBufferSizeInBytes(BUFFER_SIZE) .build() mRecorder?.startRecording()

停止錄音進程 mRecorder.stopRecording() ,隨后我們從錄音機流中讀取音頻:

private val readAudio = Runnable { var readBytes: Int buffer = ShortArray(BUFFER_SIZE) while (mRecording) { readBytes = mRecorder!!.read(buffer, 0, BUFFER_SIZE) //Higher volume of microphone //https://stackoverflow.com/questions/25441166/how-to-adjust-microphone-sensitivity-while-recording-audio-in-android if (readBytes > 0) { for (i in 0 until readBytes) { buffer[i] = Math.min( (buffer[i] * 6.7).toInt(), Short.MAX_VALUE.toInt() ).toShort() } } if (readBytes != AudioRecord.ERROR_INVALID_OPERATION) { for (s in buffer) { // Add all values to arraylist bufferForInference.add(s) writeShort(mPcmStream, s) } } } }

注意此處的乘法 buffer[i] * 6.7。這個參數(shù)用于控制麥克風增益并提高靈敏度(您可以使用其他值代替 6.7 來滿足需要)!

在此類內(nèi),還有一個將字節(jié)數(shù)組轉(zhuǎn)換為.wav文件的函數(shù)。該文件存儲在手機內(nèi)部存儲器的Pitch Detector文件夾中,可用于與原始版本對比驗證移動端模型輸出的準確性。

原始版本
https://colab.sandbox.google.com/github/tensorflow/hub/blob/master/examples/colab/spice.ipynb

部署 SPICE 模型的第一步是復(fù)制位于 Assets 文件夾中的 .tflite 文件。我們將這些依賴包含在 app build.gradle 文件中:

implementation 'org.tensorflow0.0.0-nightly' implementation 'org.tensorflow0.0.0-nightly' implementation 'org.tensorflow0.0.0-nightly'

.tflite 文件
https://tfhub.dev/google/lite-model/spice/1

最后一個依賴項含有額外的算子——這是該項目不可或缺的依賴項,但會顯著增大最終 .apk 文件的體積,因為該模型使用了一些在第一個 tflite 依賴項中沒有的算子。如需進一步了解,您可以閱讀此文。

此文
https://tensorflow.google.cn/lite/guide/ops_select#android_aar

初始化解釋器,從文件夾加載模型文件:

// load tflite file from assets folder @Throws(IOException::class) private fun loadModelFile(context: Context, modelFile: String): MappedByteBuffer { val fileDescriptor = context.assets.openFd(modelFile) val inputStream = FileInputStream(fileDescriptor.fileDescriptor) val fileChannel = inputStream.channel val startOffset = fileDescriptor.startOffset val declaredLength = fileDescriptor.declaredLength val retFile = fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength) fileDescriptor.close() return retFile } @Throws(IOException::class) private fun getInterpreter( context: Context, modelName: String, useGpu: Boolean ): Interpreter { val tfliteOptions = Interpreter.Options() if (useGpu) { gpuDelegate = GpuDelegate() tfliteOptions.addDelegate(gpuDelegate) } tfliteOptions.setNumThreads(numberThreads) return Interpreter(loadModelFile(context, modelName), tfliteOptions) }

我們準備好了,使用音頻流進行推理!

音頻流采用 ArrayList 格式。但是要將其輸入至模型,我們必須將其轉(zhuǎn)換為 float 值并正則化到 -1 到 1 的范圍內(nèi)。為此,我們將每個值除以 MAX_ABS_INT16 = 32768,然后使用解釋器執(zhí)行推理:

fun execute(floatsInput: FloatArray): ArrayList { predictTime = System.currentTimeMillis() val inputSize = floatsInput.size // ~2 seconds of sound var outputSize = 0 when (inputSize) { // 16.000 * 2 seconds recording 32000 -> outputSize = ceil(inputSize / 512.0).toInt() else -> outputSize = (ceil(inputSize / 512.0) + 1).toInt() } val inputValues = floatsInput//FloatArray(inputSize) val inputs = arrayOf(inputValues) val outputs = HashMap() val pitches = FloatArray(outputSize) val uncertainties = FloatArray(outputSize) outputs[0] = pitches outputs[1] = uncertainties try { interpreter.runForMultipleInputsOutputs(inputs, outputs) } catch (e: Exception) { Log.e("EXCEPTION", e.toString()) } }

當我們獲得結(jié)果后,我們接下來要做的是:

篩選輸出置信度超過 90% 的結(jié)果

將絕對音高轉(zhuǎn)換為赫茲 (Hz)

計算唱歌期間的偏移量

使用一些啟發(fā)式算法嘗試預(yù)測并輸出最可能的演唱樂譜。

上述步驟中,計算出理想的偏移量是重要的一步,因為通常人們哼唱的旋律與可以記譜的絕對音高值之間存在偏移。為此,我們還需要知道歌曲的速度(這樣才能確定采用的音符長度,比如八分音符)以及開始量化產(chǎn)生音符的時間偏移量。為簡單起見,我們將嘗試使用不同的速度和時間偏移并測量量化誤差,最后采用該誤差最小的組合。您可以在 PitchModelExecutor.kt 的源代碼中繼續(xù)深入了解。

PitchModelExecutor.kt 的源代碼

https://github.com/farmaker47/Pitch_Estimator/blob/master/app/src/main/java/com/george/pitch_estimator/PitchModelExecutor.kt

通過上述過程,我們獲得了含有音符字符串的 ArrayList,例如 [A2,F(xiàn)2,G#2,C3],這些結(jié)果顯示在屏幕上。

TensorFlow Hub 的 SPICE 模型示例頁面有一個出色的可視化工具,可以在靜態(tài)的五線譜上顯示不斷流入的音符。因此,是時候在我們的移動應(yīng)用程序去中復(fù)制此實時效果了!

可視化工具
https://tfhub.dev/google/lite-model/spice/1

Android webview 用于處理一些自定義 html 代碼。我們將此代碼加載到綁定適配器中:

// this binding adapter helps load custom html from assets folder @BindingAdapter("htmlToScreen") fun bindTextViewHtml(webView: WebView, htmlValue: String) { webView.settings.javaScriptEnabled = true webView.loadDataWithBaseURL("fake://not/needed", htmlValue, "text/html", "UTF-8", "") }

您可以在 這個 GitHub Gist 找到提供給 Webview 的 html 源代碼!

GitHub Gist
https://gist.github.com/farmaker47/8e3b6a5af795f32459d35d2198f07d1c

當屏幕上顯示如 [A2,F(xiàn)2] 這樣的文字音符時,我們執(zhí)行:

// Observe notes as they come out of model and update webview respectively viewModel.noteValuesToDisplay.observe(viewLifecycleOwner, androidx.lifecycle.Observer { list -> if (list.size > 0) { var i = 0 val handler = Handler() handler.post(object : Runnable { override fun run() { when (list[i]) { "C2" -> binding.webView.loadUrl("javascript:myMove('125')") "C#2" -> binding.webView.loadUrl("javascript:myMoveSharp('125')") "D2" -> binding.webView.loadUrl("javascript:myMove('130')") "D#2" -> binding.webView.loadUrl("javascript:myMoveSharp('130')") "E2" -> binding.webView.loadUrl("javascript:myMove('135')") "F2" -> binding.webView.loadUrl("javascript:myMove('140')") "F#2" -> binding.webView.loadUrl("javascript:myMoveSharp('140')") "G2" -> binding.webView.loadUrl("javascript:myMove('145')") "G#2" -> binding.webView.loadUrl("javascript:myMoveSharp('145')") "A2" -> binding.webView.loadUrl("javascript:myMove('150')") "A#2" -> binding.webView.loadUrl("javascript:myMoveSharp('150')") "B2" -> binding.webView.loadUrl("javascript:myMove('155')") ........................... } i++ if (i < list.size) { handler.postDelayed(this, 555L) } } }) } })

在這里,我們每兩秒鐘觀察一次音符變化,對于列表中的每個音符,我們執(zhí)行 javascript 函數(shù)。myMove 函數(shù)內(nèi)部的值是注釋的垂直偏移量。

此項目的 GitHub 地址(https//github.com/farmaker47/Pitch_Estimator)。

此項目使用 Kotlin 語言,并且包括:

使用 Webview 和自定義 HTML 加載。

使用 TensorFlow 的 .tflite 模型文件:

數(shù)據(jù)綁定

MVVM 模式下的協(xié)程

Koin DI

改進計劃

在應(yīng)用程序的 build.gradle 文件中,我們添加了特殊算子的依賴項:

implementation ‘org.tensorflow0.0.0-nightly’

此依賴項導(dǎo)致最終的 .apk 文件體積膨脹。我們計劃通過僅選擇模型所需的算子,以此減少最終 .apk 的大小。

通過改進算法,我們將能夠查看全音符,二分音符,休止符和其他音符。

責任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 音頻
    +關(guān)注

    關(guān)注

    29

    文章

    3030

    瀏覽量

    83220
  • 機器學習
    +關(guān)注

    關(guān)注

    66

    文章

    8499

    瀏覽量

    134314
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    330

    瀏覽量

    61094

原文標題:學習教程 | 用 TensorFlow Lite 和 SPICE 模型打造聽歌識譜 App

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    機器學習異常檢測實戰(zhàn):用Isolation Forest快速構(gòu)建無標簽異常檢測系統(tǒng)

    本文轉(zhuǎn)自:DeepHubIMBA無監(jiān)督異常檢測作為機器學習領(lǐng)域的重要分支,專門用于在缺乏標記數(shù)據(jù)的環(huán)境識別異常事件。本文深入探討異常檢測
    的頭像 發(fā)表于 06-24 11:40 ?504次閱讀
    <b class='flag-5'>機器</b><b class='flag-5'>學習</b>異常<b class='flag-5'>檢測</b>實戰(zhàn):用Isolation Forest快速構(gòu)建無標簽異常<b class='flag-5'>檢測</b>系統(tǒng)

    日賺1.1億,營收超特斯拉!比亞迪史上最強財報兩大看點

    (電子發(fā)燒友網(wǎng)報道 文/章鷹)3月24日,比亞迪發(fā)布2024年度財報,這次財報堪稱歷史上最好的財報,公司2024年實現(xiàn)營業(yè)收入7771.02億元(1069億美元),同比增長29.02%,這是比亞迪
    的頭像 發(fā)表于 03-28 01:00 ?3556次閱讀
    日賺1.1億,營收超特斯拉!比亞迪<b class='flag-5'>史上</b>最強財報兩大看點

    zeta在機器學習的應(yīng)用 zeta的優(yōu)缺點分析

    在探討ZETA在機器學習的應(yīng)用以及ZETA的優(yōu)缺點時,需要明確的是,ZETA一詞在不同領(lǐng)域可能有不同的含義和應(yīng)用。以下是根據(jù)不同領(lǐng)域的ZETA進行的分析: 一、ZETA在
    的頭像 發(fā)表于 12-20 09:11 ?1077次閱讀

    cmp在機器學習的作用 如何使用cmp進行數(shù)據(jù)對比

    機器學習領(lǐng)域,"cmp"這個術(shù)語可能并不是一個常見的術(shù)語,它可能是指"比較"(comparison)的縮寫。 比較在機器學習的作用 模型
    的頭像 發(fā)表于 12-17 09:35 ?821次閱讀

    eda在機器學習的應(yīng)用

    機器學習項目中,數(shù)據(jù)預(yù)處理和理解是成功構(gòu)建模型的關(guān)鍵。探索性數(shù)據(jù)分析(EDA)是這一過程不可或缺的一部分。 1. 數(shù)據(jù)清洗 數(shù)據(jù)清洗 是機器學習
    的頭像 發(fā)表于 11-13 10:42 ?849次閱讀

    基于機器學習的IWR6843AOP跌倒和姿態(tài)檢測實現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《基于機器學習的IWR6843AOP跌倒和姿態(tài)檢測實現(xiàn).pdf》資料免費下載
    發(fā)表于 09-03 10:02 ?2次下載
    基于<b class='flag-5'>機器</b><b class='flag-5'>學習</b>的IWR6843AOP跌倒和姿態(tài)<b class='flag-5'>檢測</b>實現(xiàn)

    雙線分音和單線分音的區(qū)別

    雙線分音和單線分音是音樂理論的兩種不同的音高表示方法。它們在音樂創(chuàng)作、演奏和理論分析中都有廣泛的應(yīng)用。 一、雙線分音 概念 雙線分音是指在五線譜上,用兩條平行的線來表示音高的方法。這兩條線可以
    的頭像 發(fā)表于 08-23 10:43 ?1613次閱讀

    機器視覺在焊接質(zhì)量檢測的應(yīng)用

    的可能性。今天跟隨創(chuàng)想智控小編一起了解機器視覺在焊接質(zhì)量檢測的應(yīng)用。 1. 機器視覺原理 機器
    的頭像 發(fā)表于 08-13 16:33 ?589次閱讀

    愛普生通過低噪音高級型號擴展了其1英寸平臺IMU產(chǎn)品線M-G370PDT

    愛普生通過低噪音高級型號擴展了其1英寸平臺IMU產(chǎn)品線-M-G370PDT現(xiàn)已上市并批量生產(chǎn),具有用戶可選擇的加速計輸出范圍和改進的陀螺儀輸出非線性-精工愛普生公司(TSE:6724,“愛普生
    的頭像 發(fā)表于 08-13 10:28 ?726次閱讀
    愛普生通過低噪<b class='flag-5'>音高</b>級型號擴展了其1英寸平臺IMU產(chǎn)品線M-G370PDT

    【《時間序列與機器學習》閱讀體驗】+ 了解時間序列

    收到《時間序列與機器學習》一書,彩色印刷,公式代碼清晰,非常精美。感謝作者,感謝電子發(fā)燒友提供了一個讓我學習時間序列及應(yīng)用的機會! 前言第一段描述了編寫背景: 由此可知,這是一本關(guān)于時間序列進行大數(shù)
    發(fā)表于 08-11 17:55

    【「時間序列與機器學習」閱讀體驗】全書概覽與時間序列概述

    時間序列的自相關(guān)性。 時間序列有基于線性場景,也有一些非線性性質(zhì)周期性和不對稱性、波動的聚集性、波動中出現(xiàn)的跳躍現(xiàn)象,以及時間的不可逆性。機器學習已經(jīng)是目前非線性時序分析的主攻方向之
    發(fā)表于 08-07 23:03

    機器學習的數(shù)據(jù)分割方法

    機器學習,數(shù)據(jù)分割是一項至關(guān)重要的任務(wù),它直接影響到模型的訓(xùn)練效果、泛化能力以及最終的性能評估。本文將從多個方面詳細探討機器
    的頭像 發(fā)表于 07-10 16:10 ?3089次閱讀

    深度學習在工業(yè)機器視覺檢測的應(yīng)用

    隨著深度學習技術(shù)的快速發(fā)展,其在工業(yè)機器視覺檢測的應(yīng)用日益廣泛,并展現(xiàn)出巨大的潛力。工業(yè)機器視覺檢測
    的頭像 發(fā)表于 07-08 10:40 ?1903次閱讀

    深度學習在視覺檢測的應(yīng)用

    深度學習機器學習領(lǐng)域中的一個重要分支,其核心在于通過構(gòu)建具有多層次的神經(jīng)網(wǎng)絡(luò)模型,使計算機能夠從大量數(shù)據(jù)自動學習并提取特征,進而實現(xiàn)對復(fù)
    的頭像 發(fā)表于 07-08 10:27 ?1246次閱讀

    機器學習在數(shù)據(jù)分析的應(yīng)用

    隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)量的爆炸性增長對數(shù)據(jù)分析提出了更高的要求。機器學習作為一種強大的工具,通過訓(xùn)練模型從數(shù)據(jù)中學習規(guī)律,為企業(yè)和組織提供了更高效、更準確的數(shù)據(jù)分析能力。本文將深入探討機器
    的頭像 發(fā)表于 07-02 11:22 ?1351次閱讀