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

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

这个安装使用Python非常简单,期间为了折腾用Python播放音频,还试过在Termux中装kali,Python的pygame执行依旧提示找不到声卡。
然后删了kali还是直接用Termux+Python。

虽然最后间接实现了Python中声音播放,这里首先先说一下如何安装Termux。

Termux+Python的安装

  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
  2. sshd,sshd的server就在Termux的后台启动起来了。
  3. 将PC上的~/.ssh/id_rsa.pub复制到手机/sdcard/目录下
    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)的方式实现声音播放
在我的代码中,因为需要后台播放的同时要做一些input输入操作,还要做到停止可控,所以用了多进程的方法

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. 下载APP应用Termux:API安装,然后就能用了。
  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间接实现播放,不过效果还可以的。

你可能感兴趣的:(Python)