~Python中的struct模块的使用

时间:2024-03-03 12:45:06

百度语音识别引擎使用

~安装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/

选择 Gzipped source tarball

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通用)

260030418761096.png

 

~关于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\')) 

 

 

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