~安裝python(需要root權限下安裝,windows和linux都是)
ubuntu下一般自帶python,升級的話看下面
windows下需要安裝
下載python3后
1.以root權限打開終端,進入安裝包的存放路徑,解壓安裝包:
tar -xzvf Python-3.6.0.tgz 11
2.進入解壓好的安裝包路徑:
cd Python-3.6.011
3.編譯安裝包,指定安裝路徑,並執行安裝命令:
注意:prefix參數用於指定將Python安裝在新目錄,防止覆蓋系統默認安裝的python
./configure --prefix=/usr/local/python36
make && make install
4.修改系統默認的Python路徑,因為在終端中輸入Python命令時默認是指向Python2.6.6
mv /usr/bin/python /usr/bin/python-2.6.6
5.建立新的軟連接,指向Python-3.6.0:
注:這里的python36是第4步指定的安裝路徑,python3.6是Python包里的可執行程序
ln -s /usr/local/python36/bin/python3.6 /usr/bin/python
6.因為yum是依賴python的,所以這里我們修改了默認的python,就要要修改yum,
讓其運行指向舊的版本:
vi /usr/bin/yum
將第一行中的“#!/usr/bin/python”修改為“#!/usr/bin/python-2.6.6”,保存即可
打開后在想添加的位置處按a代表在其后添加,改完后按esc后輸入wq保存並退出
7.如果順利的話,通過以上過程Python的安裝就基本完成了,可以打開一個新的終端,通過
python命令進入python環境,就可以看到已經指向了我們新安裝的python3.6.0:
[centos65_1@localhost:~]$ pythonPython 3.6.0 (default, Jul 30 2016, 19:40:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwinType "help", "copyright",
"credits" or "license" for more information.
>>>
~安裝pyaudio和requests和其他軟件
windows下指令為
pip install pyaudio, pip install requests
ubuntu下指令為
sudo apt-get install python-pyaudio python3-pyaudio
ubuntu下指令為
sudo apt-get install python3-requests
pip install portaudio
pip install SpeechRecognition
pip install pyaudio
sudo apt-get install python-pyaudio
sudo apt-get install libjack-jackd2-dev portaudio19-dev
~安裝anaconda(python集成環境)(以root權限安裝,linux和window是都是)
https://www.continuum.io/downloads
從上面網址下載
之后放在自己在選擇的目錄內
在終端輸入:sudo chmod +x *.sh
再輸入:sudo ./*.sh可安裝到任意目錄,./*.sh可安裝到當前用戶有權限的目錄
到anaconda3文件夾下的bin文件夾中,打開命令行窗口,輸入./spyder 可以打開IDE環境
~將.ui轉換為.py文件(需要使用pyqt)
一個命令就可以搞定:pyuic5 -x demo.ui -o demo.py
解釋一下這個命令。首先,要使用這個命令,必須安裝pyqt5-dev-tools這個包,這個包很小,直接apt-get,100KB左右。現在解釋命令:-x
后面跟的是需要轉換的文件。比如,在我們這個情況下,
需要轉換的文件叫做demo.ui;而-o后面跟的文件名是你想要輸出成的python程序的名字。這里,方便起見,我們就把它叫做demo.py。
~在安裝pyaudio時候出現錯誤src/_portaudiomodule.c:29:23: fatal error: portaudio.h:
Failed building wheel for pyaudio
sudo apt-get install libportaudio-dev
sudo apt-get install libasound-dev
sudo apt-get install portaudio19-dev
pip install --allow-unverified=pyaudio pyaudio
~出現如下問題
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
sudo apt-get install multimedia-jack
pulseaudio --kill
jack_control start
~出現如下錯誤
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused
sudo apt-get install pulseaudio
~出現如下錯誤
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
1.打開alsa.conf,通過
sudo nano /usr/share/alsa/alsa.conf
或者
vi /usr/share/alsa/alsa.conf
對其中的
pcm.front cards.pcm.default
pcm.rear cards.pcm.default
pcm.center_lfe cards.default
pcm.side cards.pcm.default
后面都變為(國外的網站上還改了其他pcm定義的位置,共十五處,但改完后出現核心轉存錯誤),此時耳機需注意插到前面還是后面,喇叭會有輸出
.default
2.在命令行輸入
sudo apt-get --no-install-recommends install jackd2
有時候可能則需要下面這個
sudo apt-get install jackd1
sudo apt-get purge bluez-alsa
注意-start
這里還可以可以安裝jackd1
配置如下
sudo gedit /etc/security/limits.conf
確保其中有
@audio - rtprio 99
輸入命令行如下,添加用戶
sudo usermod -a -G audio sanstyle
jackd -d alsa
程序會進去,啟動服務(此時不要關),或者使用
jack_control start一直打開服務
3.輸入
espeak "Roses are Red. Violets are Blue. Blah Blah Blah Blah"
4.輸入
sudo dpkg-reconfigure -p high jackd
5.通過
sudo gedit /etc/security/limits.d/audio.conf
確保其中有如下兩行
@audio - rtprio 95
@audio - memlock unlimited
6.終端輸入
sudo adduser mao audio 其中mao是用戶名
7.終端輸入
ulimit -r -l
問題得到解決
~打開alsa的配置linux alsa聲卡管理器
alsamixer
~安裝3.5mm mic驅動
sudo apt-get install jackd2
sudo dpkg-reconfigure -p high jackd2
~缺少python35_d.lib(試過了不好使,但也許是解決方案)
1. Python.org 下載源碼包
地址:https://www.python.org/downloads/source/
2.解壓,打開pcbuild目錄下的sln文件,必須用>= VS2015的VS才能打開該解決方案,
我用的是vs2015,過低版本的vs打不開該解決方案。如下紅色圈圈指出了該版本的python對應的VS版本為VS2015
在debug模式下, 編譯python工程即可
~fatal error LNK1104: 無法打開文件“python35_d.lib”解決方法
在pyconfig.h中第315行改為
# if defined(_DEBUG)
//# pragma comment(lib,"python35_d.lib")
# pragma comment(lib,"python35.lib") // no debug lib in python distribution
# elif ...
第360行改為
#ifdef _DEBUG
//# define Py_DEBUG
#endif
~在windows下安裝gcc
詳細見
http://jingyan.baidu.com/article/c275f6bacc0126e33c756771.html
~安裝python
https://www.python.org/ftp/python/3.6.0/python-3.6.0-amd64.exe
之后注冊環境變量,將c:\Python36添加到path中
~python3.h調用的object.h中
typedef struct PyType_Slot{
int slot; /* slot id, see below */
void *pfunc; /* function pointer */
} PyType_Slot;
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
出現如下編譯錯誤
C:\Python36\include\object.h:448: error: expected unqualified-id before ';' token
PyType_Slot *slots; /* terminated by slot==0. */
^
將slots名字進行更改,因為跟槽函數沖突
~在qt中添加頭文件和庫文件路徑(windows和linux通用)
~關於undefined reference to `_imp__Py_Initialize'和崩潰問題
解決方法在windows下通過,將python和anaconda卸載,之后重新以root權限安裝
~qt調用python程序(通過windows測試)
QStringList args;//QStringList類提供了一個字符串列表
args.append("D:/SIAT/program/voice/asr(can recognize)/test.py");// 增加字符串
args.append("-n");
args.append("lily");
QProcess::execute(QString("Python"), args); //這里Python可以換為Python.exe
其中QStringList的成員函數使用見
http://blog.csdn.net/qq419036154/article/details/6502150
~有關Py_Initialize()和Py_Finalize()的說明和使用可以參照
http://www.360doc.com/content/13/0812/11/9934052_306564761.shtml
~windows下更改默認的python
當系統中安裝了多個python時,如果想更改默認的python,只需要將環境變量里面另一個python路徑去掉就好
~python中出現問題“struct.error: argument for 's' must be a bytes object”的解決辦法
將
fhead = struct.pack('>qq5s',56,38,"hello")
改寫為
fhead = struct.pack('>qq5s',56,38,"hello".encode('utf-8'))
~Python中的struct模塊的使用
http://www.cnblogs.com/yezl/p/5861787.html
~使用socket通信的幾種方法
http://www.cnblogs.com/GarfieldTom/archive/2012/12/16/2820143.html
http://www.jb51.net/article/66787.htm
http://www.cnblogs.com/alan-babyblog/p/5260156.html
http://bbs.csdn.net/topics/390722604
~使用socket發送和接受數據(python)(使用udp方式)
接收端(此端口需要先打開)(這里還需要注意port套接字只能使用一次):
import socket
port=8081
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#從指定的端口,從任何發送者,接收UDP數據
s.bind(('',port))
print('正在等待接入...')
while True:
#接收一個數據
data,addr=s.recvfrom(1024)
print('Received:',data,'from',addr)
實際使用時data可以改寫為data.decode('utf-8')
發送端(端口需要和接收端port相同):
import socket
port=8081
host='localhost's=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(b'hello,this is a test info !',(host,port))
實際使用時可以將b'hello,this is a test info !'改寫為value.encode('utf-8')
~使用qt實現udp通信
參考如下兩個網址
http://www.bkjia.com/Androidjc/865926.html
http://tieba.baidu.com/p/4301470835
~實現python做發送端,qt做接收端通信
在python處添加如下代碼:
import socket
port=8088
host='localhost'
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
在指定想發送數據位置添加
s.sendto(value.encode('utf-8'),(host,port))
在qt處:
1.要使用widgets application方式構建工程(因為里面要使用this指針)
2.在mainwindow.h中添加
#include <QtNetwork>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>
private:
QUdpSocket *m_rcvSocket; //這個不要在函數cpp中定義
public slots:
void readPendingDatagrams();
3.在mainwindow.cpp中
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_rcvSocket = new QUdpSocket(this);
m_rcvSocket->bind(8088, QAbstractSocket::DontShareAddress);
ui->textReceive_2->setText(QString(QHostAddress::LocalHost));
connect(m_rcvSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}
void MainWindow::readPendingDatagrams()
{
QHostAddress addr;
quint16 port;
while(m_rcvSocket->hasPendingDatagrams())
{
QByteArray qb;
qb.resize(m_rcvSocket->pendingDatagramSize());
m_rcvSocket->readDatagram(qb.data(), qb.size(), &addr, &port);
QTextCodec *codec = QTextCodec::codecForName("GB2312");
QString str = codec->toUnicode(qb);
QString qStrIP = addr.toString();
if (qb.size())
{
ui->label->setText(QString(qb.data()));
// ui->label2->setText(QString(qStrIP + " said:\n"));
}
}
}
~bt_audio_service_open: connect() failed: Connection refused (111)
sudo apt-get purge bluez-alsa
~TypeError: sequence item 0: expected string, int found錯誤
wf.writeframes("".join(data)) 改為wf.writeframes(b"".join(data),原因是3.3的join函數需要使用unicode格式的參數。
~有關TCP/IP的通信可以參考網址
http://www.cnblogs.com/GarfieldTom/archive/2012/12/16/2820143.html
~最后整理后在linux上配置的步驟
1.安裝linux + update + upgrade
2.安裝Anaconda(安裝時賦予安裝文件權限 sudo chmod 777 -R ...)
Sudo chmod +x *.sh
再輸入:sudo ./*.sh可安裝到任意目錄,./*.sh可安裝到當前用戶有權限的目錄
安裝完后將文件夾賦予權限 sudo chmod 777 -R
3.之后運行python test.py后出現”No module named ‘pyaudio’”的問題,問題”error command ‘gcc’ faild with exit status 1”也可以一同解決
sudo apt-get install libportaudio-dev
sudo apt-get install libasound-dev
sudo apt-get install portaudio19-dev
pip install --allow-unverified=pyaudio pyaudio
pip3 install --allow-unverified=pyaudio pyaudio
此時可能出現錯誤:程序“pip”尚未安裝或者程序“pip3”尚未安裝,要安裝
sudo apt-get install python-pip
sudo apt-get install python3-pip
上述安裝pip3如果出現錯誤的情況需要加sudo
4.打開alsamixer,用”m”鍵打開MIC
5.安裝jackd2
sudo apt-get install jackd2
出現選項選是
6.去掉藍牙
sudo apt-get purge bluez-alsa
7.解決2239的錯誤
a.打開alsa.conf,通過
sudo nano /usr/share/alsa/alsa.conf
b.將報錯對應的位置后面都改為default(參照如下)
pcm.front cards.pcm.default
pcm.rear cards.pcm.default
pcm.center_lfe cards.default
pcm.side cards.pcm.default
8.遇到權限問題
a.通過
sudo gedit /etc/security/limits.d/audio.conf
確保其中有如下兩行
@audio - rtprio 95
@audio - memlock unlimited
b.終端輸入
sudo adduser mao audio 其中mao是用戶名
c.終端輸入
ulimit -r -l
d.重啟系統
9.運行程序前需要打開jackd驅動
jack_control start
10.運行程序
在程序目錄下執行python test.py