Package: graiax-silkcoder
Graiax-silkcoder现在版本：这，是一个Python的silk转码器通过将kn007/silk-v3-decoder通过简单的封装制成安装从 PyPI# 如果需要转换非wav的音频文件，则需要自行安装ffmpegpipinstallgraiax-silkcoder# 也可以通过下面的方式使用imageio-ffmpeg中的ffmpegpipinstallgraiax-silkcoder[ffmpeg]#  在 0.3.0 后，可以通过以下方式使用libsndfile来解析音频pipinstallgraiax-silkcoder[libsndfile]注: 假设你是Windows用户，安装时出现了error: Microsoft Visual C++ 14.0 is required:请安装Microsoft C++ Build Tools从 conda-forgecondainstallgraiax-silkcoder-cconda-forge# 如果需要 ffmpeg，可以一并从 conda-forge 安装condainstallffmpeg-cconda-forgeQ&AImportError：DLL load failed while importing _silkv3：找不到指定的模块相关issue: #23现在本库已经通过Github Actions来预编译 whl 了，出现这种问题一般不是说没有编译。如果遇到这种问题，请在这里下载最新版本的C++ Redistributable我去除了大部分的 C++ 的代码，但是我保留了一部分，才让你知道，才知道你用的，是 C++IOS 音频问题IOS 的音频解码器因为某些特性，只支持解码25kbps 以下的音频。所以在 0.2.6 中，我们新增了一个ios_adaptive参数（默认为 False）。当为 True 时，将把自适应最高码率限制在 24kbps 以下（一般是限制在 100kbps 以下）ffmpeg 转换成aac格式的问题因为graiax-silkcoder全程采用 PIPE 的形式跟 ffmpeg 传输，所以假设你想要将 silk 转码成 aac 的时候，就会出现一些问题。解决方法如下awaitsilkcoder.async_decode("a.silk","a.m4a",audio_format="adts")注：ADTS 是 AAC 音频的传输流格式自定义ffmpeg_path可能有一些用户会想要自定义ffmpeg的路径
你可以使用以下方法解决:fromgraiaximportsilkcodersilkcoder.set_ffmpeg_path("./ffmpeg")CLI（0.2.0新增）使用办法# 其他参数与encode / decode 保持一致python-mgraiax.silkcoderencode-i"a.wav""a.silk"python-mgraiax.silkcoderdecode-i"a.silk""a.wav"是ffmpeg还是libsndfile在该项目最开始的时候，就有人吐槽过：为了简简单单的音频转换去下载一个大的离谱的 ffmpeg，这也太麻了吧。（注：虽然说 ffmpeg 可以通过 disable 一大堆不必要视频/滤镜库来达到减小体积的目的，但是这需要自己编译，对小白挺不友好的）所以，从 0.3.0 开始，开始增加了通过 libsndfile 来使用解析音频。libsndfile 是一款广泛用于读写音频文件的C语言库，
他支持包括 flac, ogg, opus, mp3[1]等多种格式。注：在同时可以使用ffmpeg和libsndfile的情况下，graiax-silkcoder会优先使用ffmpeg进行转码使用方法Tips:因为同步和异步的区别只有前面是否有一个async_所以下面我们就只拿同步方法距离了编码你可以传入 pathlike、str、bytes 作为你的输入fromioimportBytesIOfrompathlibimportPathfromgraiaximportsilkcoderdata:bytes=silkcoder.encode("a.wav")data:bytes=silkcoder.encode(Path("a.wav"))data:bytes=silkcoder.encode(Path("a.wav").read_bytes())data:bytes=silkcoder.encode(BytesIO(Path("a.wav").read_bytes()))它也能输出到 filelike、bytesfromioimportBytesIOfrompathlibimportPathfromgraiaximportsilkcoderdata:bytes=silkcoder.encode("a.wav")silkcoder.encode("a.wav","a.silk")silkcoder.encode("a.wav",Path("a.silk"))silkcoder.encode("a.wav",BytesIO())它能做到截取一部分来编码fromgraiaximportsilkcoder#从最开始截取 5ssilkcoder.encode("a.wav","a.silk",t=5)#从第 10s 开始截取 5ssilkcoder.encode("a.wav","a.silk",ss=10,t=5)你可以指定你的编码器fromgraiaximportsilkcoderfromgraiax.silkcoderimportCodecsilkcoder.encode("a.mp3","a.silk",codec=Codec.libsndfile)silkcoder.encode("a.mp3","a.silk",codec=Codec.ffmpeg)在 ffmpeg 模式下，你甚至可以直接传入 ffmpeg 参数fromgraiaximportsilkcoder# 虽然 -vn 是可有可无，但我想不出其他例子了silkcoder.encode("a.mp4","a.silk",codec=Codec.ffmpeg,ffmpeg_para=["-vn"])你还可以指定输出 silk 的码率大小fromgraiaximportsilkcoder# 默认状态下将会将尝试将目标语音大小限制在980kb上下silkcoder.encode("a.wav","a.silk",rate=70000)解码跟编码一样，你的输入和输出都支持 pathlike、str、bytes在非 wave 模式下，你可以写 metadatafromgraiaximportsilkcoderfromgraiax.silkcoderimportCodecmetadata={"title":"xx群","artist":"xx网友"}# Tips： 如果你硬是选了 wave，他会忽略 metadata 参数而不是报错silkcoder.decode("a.silk","a.flac",codec=Codec.libsndfile,metadata=metadata)在 ffmpeg 模式下，你可以选择输出的码率（仅对于有损格式）在 libsndfile 模式下，你可以选择输出的质量（vbr）（仅对于有损格式）fromgraiaximportsilkcoderfromgraiax.silkcoderimportCodec#ffmpeg 转换成 128kbps 的 mp3silkcoder.decode("a.silk","a.mp3",codec=Codec.ffmpeg,rate=128000)#libsndfile 转换为 压缩率最大 的 flac （注，quality 参数只能在 0~ 1 ）silkcoder.decode("a.silk","a.flac",codec=Codec.libsndfile,quality=1)你甚至可以在 ffmpeg 模式下输入 ffmpeg 参数fromgraiaximportsilkcodersilkcoder.decode("a.silk","a.mp3",ffmpeg_para=["-ar","44100"])注graiax-silkcoder对libsndfile的支持来源于第三方库soundfile，而该库在 0.11.0 之前并不支持mp3、opus。可能有一些库会将soundfile锁定在 0.11.0 版本前，如果 mp3 无法读取，请选择 ffmpeg