【问题标题】:How to get audio (Mic) input working on Android with python/kivy如何使用 python/kivy 在 Android 上获取音频(麦克风)输入
【发布时间】:2020-05-06 23:44:03
【问题描述】:

来自访问者的编辑:目前围绕这种情况的共识似乎是 Kivy 目前不支持麦克风,我们请求人们帮助移植“audiostream”插件,以便它可以工作再次。非常感谢任何有助于此的微小工作。更多信息如下。

我尝试让麦克风在 android 上工作,我主要使用 kivy 和 buildozer 我用音频流输出了音频,但是该模块已经过时了,如果使用输入“录音”GITHub Issue 将无法再工作。好吧,我无法在电脑上进行录音,因为一旦我使用录音功能,它就会说“不支持” ,在文件上只提到移动设备,所以没关系。无论如何,它都可以在那些平台上用 pyaudio 替换。

我试图搜索我可以使用的其他选项,所以我遇到了 pyjnius 和 MediaRecorder,我对 java 非常陌生,(并且尝试学习 python atm,所以那里也是新手)所以我无法得到它在职的。 问题在于,我需要将所有麦克风数据转换为字节,这对 pyaudio 来说很容易,而且它可以工作。为什么我在这里,它是 pyaudio 不起作用的 android(至少我还没有尝试将库编译到 android,我知道这可能是可能的,但很多工作..)

这是我必须尝试让它工作的代码:

            MediaRecorder = autoclass('android.media.MediaRecorder')
            AudioSource = autoclass('android.media.MediaRecorder$AudioSource')
            OutputFormat = autoclass('android.media.MediaRecorder$OutputFormat')
            AudioEncoder = autoclass('android.media.MediaRecorder$AudioEncoder')
            FileOutputStream = autoclass('java.io.FileOutputStream')
            gaindata = io.BytesIO()
    
            mRecorder = MediaRecorder()
            mRecorder.setAudioSource(AudioSource.MIC)
            mRecorder.setOutputFormat(OutputFormat.THREE_GPP)

            mRecorder.setOutputFile(gaindata.getBytes())
            mRecorder.setAudioEncoder(AudioEncoder.AMR_NB)
            mRecorder.prepare()

我知道 FileDescriptor 有一些东西,有一些例子,但它们都在字符串上有空格,所以我不知道如何将它们转换为 python.. 我想要的只是 setOutputFile -> gaindata

如果有另一个选项会很好,我需要来自麦克风的 bytesIO 数据(首选 8000、单声道、不带标题或 GSM6.10 的原始 wav),我将使用声音文件将其转换(是的,我确实编译了 libsndfile.so 到 arm ) 进入 gsm6.10 并将其放入套接字,它是一个 VoIP 应用程序。

【问题讨论】:

    标签: java python android kivy pyjnius


    【解决方案1】:

    音频流

    audiostream 也使用 pyjnius

    https://github.com/kivy/audiostream/blob/master/audiostream/platform/plat_android.pyx

    from jnius import autoclass
        AudioIn = autoclass('org.audiostream.AudioIn') 
    

    我认为最好的方法是修复音频流,以便其他人也可以使用它,因为在 kivy 的文档中提到要使用它:

    https://kivy.org/doc/master/api-kivy.core.audio.html

    Note
    The core audio library does not support recording audio. If you require this functionality, please refer to the audiostream extension.
    

    或者您提取项目的核心功能以便您可以使用它。

    pyaudio

    我发现使用麦克风的其他项目是 https://pypi.org/project/SpeechRecognition/ 使用 pyaudio

    但我不知道这是否适用于 android。如果没有您的评论,我会认为它可以工作,因为有人创建了一个 kivy 应用程序来使用它......

    https://github.com/jmercouris/speech_recognition

    【讨论】:

    • 感谢您的回答。音频流,它出错了 ImportError:dlopen 失败:找不到符号“SDL_ANDROID_GetJNIEnv”不知道从那里开始修复.. pyaudio:很好需要 portaudio,而 portaudio 没有配方。但我可能能够像在 sndfile.so 上那样将 arm lib 二进制文件编译到 android。看起来 peech_recognition 没有提到关于 android.. 只有 kivy。
    • 为了修复 SDL_ANDROID_GetJNIEnv 错误,我会尝试将音频流迁移到 SDL2 wiki.libsdl.org/MigrationGuide#Audio,如果它可以正常工作
    • 好吧,深入研究后,它会使用 SDL2 和配方,也可以只用 sdl2 编译它。所以这不是问题。但我查看了 android_ext.h 有 void audiostream_jni_register() { if ( !audiostream_jni_registered ) { JNIEnv *env = SDL_ANDROID_GetJNIEnv(); jclass cls = (*env)->FindClass(env, "org/audiostream/AudioIn"); (*env)->RegisterNatives(env, cls, methods, sizeof(methods) / sizeof(methods[0])); audiostream_jni_registered = 1; } } org/audi .. 尝试添加 android,有
    • 它可能似乎找不到文件 AudioIn 或其他东西.. 嗯
    • 修改您的问题,以便更容易获得帮助
    【解决方案2】:

    我已经研究过了,您仍然可以使用使用 PyAudio 的 SpeechRecognition 在 PC 中录制音频。 对于移动设备,我认为 Buildozer 不支持它,因为我尝试过它并没有用。 audiostream 似乎已经过时了,但我还没有尝试过。 编辑: 我刚刚尝试使用音频流,但我似乎无法让它工作。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2017-09-17
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多