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

时间:09-17来源:作者:点击数:
城东书院 www.cdsy.xyz

写了点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 u0_a53@192.168.100.4 -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间接实现播放,不过效果还可以的。


以下是装pygame的记录, 因为被问到所以发出来, 实际上我也只是装上就删了,可以用于参考吧

2020-03-03Termux上装kali

安装kali

https://www.kali.org/docs/nethunter/nethunter-rootless/

  1. Install the NetHunter-Store app from https://store.nethunter.com
  2. From the NetHunter Store, installTermux,NetHunter-KeX client, andHacker’s keyboard
  3. Open Termux第一次打开的时候,会有一个installing加载(加载了4次才成功)加载成功后,会出现命令行提示符,可以开始输入命令
    and type: 逐条执行
    pkg update && pkg upgradeapt-get update && apt-get upgrade(检查更新与升级),先更新一下
    termux-setup-storage
    pkg install wget
    wget -O install-nethunter-termux https://offs.ec/2MceZWr
    chmod +x install-nethunter-termux
    ./install-nethunter-termux# 经常失败多试几次,执行成功后显示下载进度条(1.2G左右,速度500KB,约40分钟下完)

打开kali

  1. 执行nethunter,进入kali
  2. 为kali 添加更新源
  3. 打开源文件:vim /etc/apt/sources.listi,粘贴,按Esc,:wq保存。
  4. 这些源都放进去也行,但是最好放一两个就够了。(我留了中科大、阿里云和官方)
#中科大
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

#阿里云
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib

#清华大学
deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free

#浙大
deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free

#东软大学
deb http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contrib
deb-src http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contrib

#官方源
deb http://http.kali.org/kali kali-rolling main non-free contrib
deb-src http://http.kali.org/kali kali-rolling main non-free contrib
  1. apt-get update && apt-get upgrade(检查更新与升级)
  2. 装pip3(kali默认装了Python2的pip就是没有装3的)
  3. sudo apt-get install python3-pip安装pip3。
    执行sudo的时候,密码是kalihttps://www.kali.org/docs/introduction/default-credentials/
    如果失败可以尝试这条命令:pip install -i https://pypi.douban.com/simple pandas
    卸载命令:sudo apt-get remove python3-pip
    更新命令:python3 -m pip install -U pip

用野蛮的方法安装依赖库

安装pygame装不上

Hunting dependencies…

WARNING: “sdl-config” failed!

WARNING: “pkg-config freetype2” failed!

WARNING: “freetype-config” failed!

Unable to run “sdl-config”. Please make sure a development version of SDL is installed.

开始野蛮安装

#install dependencies
sudo apt-get install freetype freetype-dev mercurial python3-dev python3-numpy ffmpeg \
libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsmpeg-dev \
libsdl1.2-devlibportmidi-dev libswscale-dev libavformat-dev libavcodec-dev

继续报错

Hunting dependencies…

WARNING: “pkg-config freetype2” failed!

WARNING: “freetype-config” failed!

SDL : found 1.2.15

FONT: found

IMAGE : found

MIXER : found

PNG : found

JPEG: found

SCRAP : found

PORTMIDI: found

PORTTIME: found

FREETYPE: not found

Missing dependencies

apt search freetype的时候发现有一个python3-freetype存在,于是安装sudo apt-get install python3-freetype

还是不好使

继续找,发现有建议安装依赖sudo apt-get build-dep python-pygame的,试试看

好像还是有点报错,但是毕竟还是装上了

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门