安卓手機跑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間接實現播放,不過效果還可以的。

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