1. 程式人生 > >嵌入式Qt下使用科大訊飛的TTS語音模組

嵌入式Qt下使用科大訊飛的TTS語音模組

使用寫檔案方法傳送(str直接填中文即可)

int KeyboardSerialTalk::ttsSend(QString str)

{
    QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
    QTextCodec *gbk = QTextCodec::codecForName("GBK");
    QByteArray gbk_byte;
    qDebug()<<"str:"<<str.toLatin1().toHex()<<"\ngbk:"<<gbk->fromUnicode(utf8->toUnicode(str.toLatin1())).toHex();

    gbk_byte = gbk->fromUnicode(utf8->toUnicode(str.toLatin1()));
    int len = gbk_byte.length();

    int ret;
    char buf[1024] = {0};

    buf[0] = 0xFD ; //構造幀頭FD
    buf[1] = 0x00 ; //構造資料區長度的高位元組
    buf[2] = len+2; //構造資料區長度的低位元組
    buf[3] = 0x01 ; //構造命令字:合成播放命令
    buf[4] = 0x01;       //文字編碼格式:01:GBK 03:unioncode


    memcpy(buf+5, gbk_byte.data(), len);
    buf[len+5]=0x0d;
    buf[len+6]=0x0a;//
    
    ret = write(keyboard_fd, buf, len+7);
    sleep(1);
    return ret;

}

使用ManageSerialPort串列埠類傳送

void MainWindow::ttsSend(QString str)
{
    QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
    QTextCodec *gbk = QTextCodec::codecForName("GBK");

    QByteArray gbk_str = gbk->fromUnicode(utf8->toUnicode(str.toLatin1()));
    qDebug()<<"str:"<<str.toLatin1().toHex()<<"\ngbk:"<<gbk_str.toHex();

    QByteArray buf;
    buf[0] = 0xFD ; //構造幀頭FD
    buf[1] = 0x00 ; //構造資料區長度的高位元組
    buf[2] = gbk_str.length()+2; //構造資料區長度的低位元組
    buf[3] = 0x01 ; //構造命令字:合成播放命令
    buf[4] = 0x01;       //文字編碼格式:0x01 GBK   0x03 unioncode
    buf += gbk_str;
    buf[str.length()+5]=0x0d;
    buf[str.length()+6]=0x0a;//

    m_pSerialPortPark->sendData(buf);
}