在用 python 编写的天蓝色函数应用程序中使用 librosa

Posted

技术标签:

【中文标题】在用 python 编写的天蓝色函数应用程序中使用 librosa【英文标题】:Using librosa in an azure function app written in python 【发布时间】:2020-11-14 22:47:33 【问题描述】:

我正在使用 python 中的一个 azure 函数,它使用 librosa 来可视化一些音频数据。它在我的 vscode 的 windows 框中本地运行良好。从命令行远程构建

func azure functionapp publish functionappname --build remote

成功,但是当客户端向其发布数据时,它会失败

OSError: sndfile library not found

File "/home/site/wwwroot/VisualizeDemo/__init__.py", line 20, in <module> import librosa 
File "/home/site/wwwroot/.python_packages/lib/site-packages/librosa/__init__.py", line 12, in <module> from . import core 
File "/home/site/wwwroot/.python_packages/lib/site-packages/librosa/core/__init__.py", line 126, in <module> from .audio import * # pylint: disable=wildcard-import 
File "/home/site/wwwroot/.python_packages/lib/site-packages/librosa/core/audio.py", line 10, in <module> import soundfile as sf 
File "/home/site/wwwroot/.python_packages/lib/site-packages/soundfile.py", line 142, in <module> raise OSError('sndfile library not found')

我了解 librosa 依赖于 libsndfile,并且

pip install librosa

还在我的本地安装 libsndfile,并且该 libsndfile 不包含在我上传到 azure 的***中。我跑了

apt-get install libsndfile1

在函数主机上,将库安装在那里,似乎已经成功:

root@7d0b717a5bb5:/home/site/wwwroot# apt-get install libsndfile1
Reading package lists... Done
Building dependency tree
Reading state information... Done
libsndfile1 is already the newest version (1.0.28-6).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

但是函数还是找不到。是否有不同的方法来安装 libsndfile 以便函数可以看到它,或者告诉函数在哪里寻找该库?函数应用在常规应用服务计划上运行,而不是无服务器消费计划。

【问题讨论】:

【参考方案1】:

默认情况下,Linux 上的 Azure Function 在默认容器中运行。因此,在 Function 主机中通过 apt-get install libsndfile1 安装不会对容器内的内容产生影响。对于这种情况,您应该考虑Creating function using a custom container。

您可以使用来自here 的 Python 函数基础映像 在上面提供的 docker 文件中,您会看到多个 apt-get 安装,具体取决于您选择的映像。只需添加您所需的依赖项(在本例中为libsndfile1)。 参考guide 构建和部署您的函数。

注意:消费计划不支持自定义图片。它需要高级计划或专用(应用服务)计划。

【讨论】:

【参考方案2】:
    root@7d0b717a5bb5:/home/site/wwwroot#apt-get update
    root@7d0b717a5bb5:/home/site/wwwroot#apt-get install g++
    root@7d0b717a5bb5:/home/site/wwwroot#apt-get install libsndfile1
    root@7d0b717a5bb5:/home/site/wwwroot#pip install librosa

上面的命令是我的猜测。如果apt-get install libsndfile1提供的命令是正确的,你的问题应该解决了。

因为我之前也遇到过类似的问题,我的回答可以完美解决。建议尝试一下,也可以提供样例demo或者参考文档,以便我在我的环境中测试,可以更好的帮助到你。

更多详情,您可以参考下面的帖子。

How to access ODBC Driver on Azure App service

【讨论】:

嗨,杰森。谢谢你的帮忙。我运行了这些命令,但仍然得到同样的错误。看起来它是由函数主 init.py 中的import librosa 触发的。当我运行 apt-get install libsndfile1 时,它说 libsndfile1 is already the newest version (1.0.28-6). 0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded. 在运行这些命令之前我应该​​卸载 libsndfile1 吗? 你能分享一下你使用librosa的示例代码吗,只是demo让我测试一下,tks。 libsndfile1无需卸载,直接运行pip install librosa即可。 如果您能提供示例代码,我将能够帮助您更快地解决这个问题,只需提供使用librosa的片段代码,可以上传到github。 我刚刚做了一个测试函数,它只是一个裸 httptrigger 模板,在其他导入下添加了import librosa,它做同样的事情。导入库时,它会查找 libsndfile 并失败并显示该消息。

以上是关于在用 python 编写的天蓝色函数应用程序中使用 librosa的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 websocket 请求只有在用 OOP 编写时才“未经授权”,而在仅使用函数编写时同样可以完美运行?

如何将自定义轮文件安装到天蓝色函数中?

如何在 .Net 核心和任何合适的天蓝色资源中处理长时间的处理作业?

如何在用 TypeScript (TSX) 编写的 React 应用程序中使用 Facebook Relay?

关于在用java编写的android应用程序中使用异步共享内存(ASHMEM)

Halcon代码不同颜色的意义!