安卓手机跑Python、Termux及播放音频二三事

最近自己写了点python程序,希望在手机端跑,这样能随时使用,然后发现了Termux这么好用的东西。

这个安装使用python非常简单,期间为了折腾用python播放音频,还是过在termux中装kali,然后发现还是不行,python的pygame执行依旧提示找不到声卡。

所以最后换了其他方法间接实现了声音播放,这里首先先说一下如何安装termux。

Termux的安装

  1. 安装Termux应用APP,很小巧,初次打开可能会提示installing,大概1~2分钟。

  2. 执行termux-setup-storage给予存储权限。

  3. 先更新一下,pkg update && pkg upgradeapt-get update && apt-get upgrade(检查更新与升级)

  4. 安装python3

    1. pkg install python,pkg的指令很好懂,和pip类似,安装python的同时会自动装上pip
    2. pip install --upgrade pip,更新pip
  5. 安装一些python包,比如以下两个我常用的。

    1. pip install requests
    2. pip install pyquery (如果提示lxml安装失败,需要安装依赖pkg install libxml2 libxslt libffi)

电脑SSH连termux

如果需要电脑ssh连termux,参照下面执行一下就行了

  1. apt install openssh,在Termux上搭建一个sshd server,方便
  2. sshd,sshd的server就在termux的后台启动起来了。
  3. 将PC上的~/.ssh/id_rsa.pub复制到手机/sdcard/目录下( termux上的sshd server不支持用户名密码方式登录,只能免密登录)
    1. 如果电脑C:\Users\username\.ssh\id_rsa.pub已存在,直接复制;如果不存在,运行ssh-keygen -t rsa生成。
  4. 将手机/sdcard/目录下的id_rsa.pub写入termux上~/.ssh/authorized_keys文件中
    1. 进入手机Termux,依次输入以下命令。
    2. cd ~/.ssh
    3. cp /sdcard/id_rsa.pub ./
    4. cat id_rsa.pub >> authorized_keys
  5. 建立连接ssh [email protected] -p 8022链接即可
    1. whoami,手机查看当前用户名,比如u0_a53
    2. ifconfig -a,手机查看当前ip,比如192.168.100.4
    3. ssh连接,如果显示[WARNING *** CHANGED!]Host key verification failed.,打开电脑上.ssh/known_hosts文件,将对应的192.168.100.4这一行记录删掉,然后重连选择yes。

Termux中执行python代码播放声音

在手机上想要执行的python代码,其实原本是在win上写的,涉及到声音播放。
要播放的声音其实是对英文的朗读。
试了一些语音合成最后发现还是微软的urlapi = 'http://api.microsofttranslator.com/V2/Http.svc/Speak?language=en-us&format=audio/wav&options=MaxQuality'返回的音频文件,英文朗读声音听起来最自然(还有一个原因是这个是免费的,其他tts语音合成有些比较好的效果音是收费的)。

在win上跑的时候,为了声音不影响其他代码执行,选择用pygame模块播放声音的。结果放到手机上执行,发现即使通过pip成功装上了pygame模块,pygame.mixer.init()还是会报错找不到声卡。找了一些地方没有找到直接解决方法,只能间接解决。

方法1(我最后决定使用的方法)

在termux中安装play-audio,pkg install play-audio
这样在termux中执行执行play-audio test.wav,就能播放声音了。
而且可以play-audio test1.wav test2.wav直接连续播放多个。
在python中,则是subprocess.call('play-audio '+audiopath, shell=True)的方式实现声音播放
在我的代码中,因为需要播放停止可控,所以用了多进程的方法

import subprocess
import signal
p = subprocess.Popen('play-audio '+wp,close_fds=True, stdout=subprocess.PIPE,preexec_fn=os.setsid, shell=True)      # 播放不影响其他代码操作
os.killpg(p.pid,signal.SIGUSR1)  # 关闭

方法2

因为声音是对文字的朗读,termux-api有tts所以也想试试。

  1. pkg install termux-api,然后执行卡死,才知道还需要安装个应用
  2. 安装Termux APIAPP应用安装,然后就能用了。
  3. termux-tts-speak 要朗读的英文文章,就能朗读了

然后发现效果并不好
termux-tts-engines看了一下手机默认的tts引擎,发现是讯飞的。
这个tts虽然能离线使用,但是效果肯定是远不及在线合成的。
不过我这手机也有点老了,
不知道tts这玩意怎么更新或替换,就没再研究。

之前测试朗读效果的时候,讯飞语音合成有的音源也是不错的,只不过我要朗读的是英文,量也不大,最后就用了微软的(看bing词典相关的时候,发现发音想过不错,抓取了一下发现调用了api.microsofttranslator.com这个接口实现发音)

方法3

termux-api还有一个termux-media-player,也是能播放的
测试了一下termux-media-player play test.wav,就能播放了
termux-media-player stop就能停止播放,因为之前已经选择别的方法了,就没有用这个。


总而言之
在termux想通过python播放音频,
没有找到能直接能播放的方法,
实际上都是通过subprocess间接实现播放,不过效果还可以的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章