示例#1
0
/*
 * The example session from Pebble SDK (pebble transcribe --phone jolla -vvvv "pebble sdk test 4")
DEBUG:libpebble2.communication:<- 00292af8010000000001120001011d00312e327263310000000000000000000000000000803e00000032044001
DEBUG:libpebble2.communication:<- VoiceControlCommand(command=Command.SessionSetup, flags=0, data=SessionSetupCommand(session_type=SessionType.Dictation, session_id=18, attributes=AttributeList(count=1, dictionary=[Attribute(id=AttributeType.SpeexEncoderInfo, length=29, data=SpeexEncoderInfo(version=1.2rc1, sample_rate=16000, bit_rate=12800, bitstream_version=4, frame_size=320))])))
DEBUG:libpebble2.voice:
DEBUG:libpebble2.voice:)
DEBUG:libpebble2.communication:-> VoiceControlResult(command=None, flags=0, data=SessionSetupResult(session_type=SessionType.Dictation, result=SetupResult.Success))
DEBUG:libpebble2.communication:-> 00072af801000000000100
DEBUG:libpebble2.communication:<- 00252710021200012025ce7530001b366cd9b1c09b364c62d2233fe25a16468763d58d6f493a1051f3
DEBUG:libpebble2.communication:<- AudioStream(packet_id=2, session_id=18, data=DataTransfer(frame_count=1, frames=[EncoderFrame(data=25ce7530001b366cd9b1c09b364c62d223...)]))
DEBUG:libpebble2.communication:<- 00252710021200012025458925e3ac89339017d185d97e754b91057ceccbb02340e485f2c93867ba72
DEBUG:libpebble2.communication:<- AudioStream(packet_id=2, session_id=18, data=DataTransfer(frame_count=1, frames=[EncoderFrame(data=25458925e3ac89339017d185d97e754b91...)]))
DEBUG:libpebble2.communication:<- 00252710021200012025ce45157c0ce4fbd80e69f812582aa36945040a247e292755e81139396a3a71
DEBUG:libpebble2.communication:<- AudioStream(packet_id=2, session_id=18, data=DataTransfer(frame_count=1, frames=[EncoderFrame(data=25ce45157c0ce4fbd80e69f812582aa369...)]))
DEBUG:libpebble2.communication:<- 00032710031200
DEBUG:libpebble2.communication:<- AudioStream(packet_id=3, session_id=18, data=StopTransfer())
DEBUG:libpebble2.communication:-> AudioStream(packet_id=None, session_id=18, data=StopTransfer())
DEBUG:libpebble2.communication:-> 00032710031200
DEBUG:libpebble2.voice:)
DEBUG:libpebble2.communication:-> VoiceControlResult(command=None, flags=0, data=DictationResult(session_id=18, result=TranscriptionResult.Success, attributes=AttributeList(count=None, dictionary=[Attribute(id=AttributeType.Transcription, length=None, data=Transcription(type=None, transcription=SentenceList(count=None, sentences=[Sentence(count=None, words=[Word(confidence=100, length=None, data=706562626c65), Word(confidence=100, length=None, data=73646b), Word(confidence=100, length=None, data=74657374), Word(confidence=100, length=None, data=34)])])))])))
DEBUG:libpebble2.communication:-> 002a2af8020000000012000001021e0001010400640600706562626c6564030073646b6404007465737464010034
DEBUG:libpebble2.voice:Invalidating session 18 on send
DEBUG:libpebble2.voice:Invalidating session 0 on stop
 * serialized raw framed packet of result response
 * 002a 2af8 02 00000000 1200 00 01 02 1e00 01 01 0400 64 0600 706562626c65 64 0300 73646b 64 0400 74657374 64 0100 34
 * 002a Framing - length
 * 2af8 Framing - endpoint
 * 02 - DictationResult command
 * 00000000 - flags
 * 1200 - sessionId (LE)
 * 00 - Success (result)
 * 01 - attributes:count
 * 02 - attribute:type - Transcription
 * 1e00 - attribute:length (LE)
 * 01 - Transcription Type - SentenceList
 * 01 - SentenceList:count
 * 0400 - Sentence:count (LE)
 * 64 - confidence
 * 0600 - length
 * 706562626c65 - data
 * ...
[D] VoiceEndpoint::sendDictationResults:207 - Sending session recognition result 0 for session 27 with content 1 for app QUuid("{00000000-0000-0000-0000-000000000000}") true
[D] VoiceEndpoint::AttributeList::writerWrite:305 - Writing attribute "Attribute(type=2, Transcription(type=SentenceList, SentenceList(count=1, sentences=[Sentence(count=1, words=[Word(confidence=100, word=Timeout)])])))"
[D] VoiceEndpoint::Attribute::writerWrite:352 - Serializing Transcription 0 1
[D] VoiceEndpoint::sendDictationResults:222 - Sent "0200000000001b0001020f000101010064080054696d656f757400"
 * Serialized unframed voice control packet
 * 02 00000000 0300 00 01 02 0f00 01 01 0100 64 0800 54696d656f757400
 * 02   - DictationResult
 * 0300 - sessionId
 * 00   - Success (result)
 * 01   - AttributeList:count
 * 02   - Attibute:Type - Transcription
 * 0f00 - Attribute:Length
 * 01   - Transcription:Type - SentenceList
 * 01   - SentenceList:Count
 * 01   - Sentence:Count
 * 64   - Word:Confidence
 * 0800 - Word:Length
 * 54696d656f757400 - data (Timeout\0)
 */
void VoiceEndpoint::handleMessage(const QByteArray &data)
{
    WatchDataReader reader(data);
    quint8 cmd = reader.read<quint8>();

    if(cmd == CmdSessionSetup) {
        quint32 flags = reader.readLE<quint32>();
        quint8 sessType = reader.read<quint8>();
        quint16 sesId = reader.readLE<quint16>();
        if(sesId > 0 && m_sessId == 0) {
            AttributeList list = readAttributes(reader);
            if(((flags & FlagAppInitiated)!=0) == list.contains(AttAppUuid)) {
                if(sessType == SesDictation) {
                    qDebug() << "Got Dictation session request" << sesId;
                    if(list.count > 0 && list.contains(AttSpeexInfo)) {
                        m_sessId = sesId;
                        m_sesType = (SessionType)sessType;
                        m_appUuid = list.attByType(AttAppUuid).uuid;
                        m_codec = list.attByType(AttSpeexInfo).speexInfo;
                        qDebug() << "Session Setup Request" << ((flags&FlagAppInitiated)?list.attByType(AttAppUuid).uuid.toString():"");
                        emit sessionSetupRequest(m_appUuid,m_codec);
                        m_sesPhase = PhSetupRequest;
                        m_sesTimer = startTimer(4000);
                    } else {
                        qWarning() << "Invalid attribute set for dictation request" << list.count;
                    }
                } else if(sessType == SesCommand) {
                    qDebug() << "Got Voice Command session request which is rather unexpected";
                } else {
                    qWarning() << "Unknown Session type" << sessType << data.toHex();
                }
            } else {
                qWarning() << "Invalid Flags/Attributes combination" << flags;
            }
        } else {
            qWarning() << "Invalid sessionID for session setup" << sesId << m_sessId << data.toHex();
        }
    } else {
        qWarning() << "Unknown command" << data.toHex();
    }
}