Python的C/C++擴展之Python直接調用科大訊飛語音識別動態庫

Python作為一門腳本語言有著非常好的易用性,但是很多人會病垢或糾結它的性能,不過Python與C/C++有著很好的溝通,很多對性能要求高的演算法都可以用C/C++實現後供Python調用。

Python通過C/C++進行擴展有很多方法:

  • 直接調用動態庫.so

  • CPython使用C語言API編寫模塊include

  • 使用boost_python封裝C++類

  • 使用SWIG擴展Python

本文(微信號「一再學習」)以Python使用科大訊飛語言識別的Linux介面來介紹Python如何調用動態庫.so文件。

1. Linux下生成動態庫.so文件

以下是c實現的一個簡單函數(mylib.c):

extern "C" {

int sum(int a, int b) {

return a+b;

}

}

在shell中執行如下命令就會得到mylib.so動態庫:

g++ -fPIC -shared -o libmylib.so mylib.c

2. 使用Python調用動態庫

#! /usr/bin/env python

import ctypes

import os

mylib = ctypes.CDLL(os.getcwd() + /libmylib.so)

print mylib.sum(2,6)

3. Python調用科大訊飛語音識別API

載入動態庫:

xflib = ctypes.cdll.LoadLibrary(msc/libmsc.so)

在Python裡面調用C函數時主要是注意參數的類型。語音識別的介面如下:

介面函數:const char* MSPAPI QISRSessionBegin( const char* grammarList, const char*

params, int* errorCode )

返回的是一個char指針作為sessionID以供後續介面使用,在Python裡面要用ctypes.c_voidp類型:

ret = ctypes.c_int()

sessionId = ctypes.c_voidp()

sessionId = xflib.QISRSessionBegin(None, param1, ret)

調用其它介面函數時,還可能用到如下ctypes的類型和介面:

  • ctypes.create_string_buffer()

  • ctypes.addressof()

  • ctypes.byref()

  • ctypes.string_at()

  • ctypes.c_char_p()

  • ctypes.c_uint()

關於ctypes的更詳細說明可以參考官方文檔

題圖來自可免費用於商業用途的圖片共享網站pixabay


推薦閱讀:

TAG:中文語音識別 | Python庫 |