Statistics
| Branch: | Tag: | Revision:

hlrc / client / python / hlrc_client / hlrc_speak_utterance.py @ 62d50515

History | View | Annotate | Download (4.192 KB)

1 0c286af0 Simon Schulz
#!/usr/bin/python
2
#PYTHONPATH="/opt/ros/groovy/lib/python2.7/dist-packages:/vol/csra/releases/nightly/lib/python2.7/:/vol/csra/releases/nightly/lib/python2.7/site-packages/
3
import sys
4
import wave
5
6
from textgrid_hlc import *
7
import logging
8
import errno
9
import os.path
10
11
try:
12
    import rsb
13
    import rsb.converter
14
    import rst
15
    import rstsandbox
16
    from rst.audition.Utterance_pb2 import Utterance
17
    from rst.audition.SoundChunk_pb2 import SoundChunk
18
except ImportError as exception:
19
    sys.stderr.write("ImportError: {}\n> HINT: try to export PYTHONPATH=$PYTHONPATH:$YOUR_PREFIX/lib/python2.7/site-packages/\n\n".format(exception))
20
    sys.exit(errno.ENOPKG)
21
22
class hlrc_utterance():
23
    def __init__(self, _base_scope):
24
        #print "> registering rst converter"
25
        converter = rsb.converter.ProtocolBufferConverter(messageClass = Utterance)
26
        rsb.converter.registerGlobalConverter(converter)
27
        self.set_scope(_base_scope)
28
29
    def set_scope(self, scope):
30
        self.base_scope = str(scope) #NOTE: str() is important here, scope is a qstring (?) and gets deleted during call
31
        print "> setting scope to '%s'" % self.base_scope
32
        try:
33
            self.server = rsb.createRemoteServer(self.base_scope + '/set')
34
        except ValueError:
35
            print "> invalid scope given. server deactivated"
36
            self.server.deactivate()
37
38
    def trigger_utterance(self, filename_praat, filename_wav, blocking):
39
        if (self.server is None):
40
            print("> invalid server")
41
            return
42
43
        if (not os.path.isfile(filename_praat)):
44
            print "can not open file '%s'" % (filename_praat)
45
            return 0
46
47
        if (not os.path.isfile(filename_wav)):
48
            print "can not open file '%s'" % (filename_wav)
49
            return 0
50
51
        print "> reading wave file '%s'" % (filename_wav)
52
        wav = wave.open(filename_wav, "r")
53
54
    
55
        print "> parsing praat file '%s'" % (filename_praat)
56
        tgrid = TextGrid.load(filename_praat)
57
    
58
    
59
        #create utterance & fill it with values:
60
        ut = Utterance()
61
    
62
        #textual description of audio file
63
        ut.text = filename_praat
64
        
65
        ut.audio.data = wav.readframes(-1)
66
        ut.audio.sample_count = wav.getnframes()
67
        ut.audio.channels = wav.getnchannels()
68
        ut.audio.rate = wav.getframerate()
69
    
70
        if (wav.getsampwidth() == 1):
71
            ut.audio.sample_type = SoundChunk.SAMPLE_U8
72
        elif (wav.getsampwidth() == 2):
73
            ut.audio.sample_type = SoundChunk.SAMPLE_S16
74
        else:
75
            print "> invalid sample type. py doc says wave files are either u8 or s16"
76
            exit(0)
77
    
78
        #wave spec says always little endian
79
        ut.audio.endianness = SoundChunk.ENDIAN_LITTLE
80
    
81
        print "> filling phones with data from praat"
82
        for tier in tgrid.tiers:
83
            idx = (tgrid.tiers.index(tier)) + 1
84
            transcript = tier.simple_transcript
85
            for (xmin, xmax, utt) in transcript:
86
                phoneme = ut.phonemes.add()
87
                phoneme.symbol = utt
88
                phoneme.duration = int(1000.0*(float(xmax)-float(xmin)))
89
    
90
        with rsb.createRemoteServer(self.base_scope + '/set') as server:
91
            
92
            if (blocking):
93
                #blocking:
94
                print "> calling the utterance rpc (blocking until we finished talking)..."
95
                print '> server reply: "%s"' % server.utterance(ut)
96
            else:
97
               print "> calling the utterance rpc (NON-BLOCKING)..."
98
               future = server.utterance.async(ut)
99
               #we can block here for a incoming result with a timeout in seconds
100
               #print '> server reply: "%s"' % future.get(timeout = 10);
101
    
102
        print "> done"
103
        return 1
104
105
def main():
106
    # Pacify logger.
107
    #logging.basicConfig()
108
    if (len(sys.argv) != 4):
109
        print "> usage: %s <base_scope> file.praat file.wav\n>     example: %s /flobi1 hello.praat hello.wav" % (sys.argv[0] , sys.argv[0])
110
        sys.exit(0)
111
112
    filename_praat = sys.argv[2]
113
    filename_wav = sys.argv[3]
114
    base = sys.argv[1]
115
116
    hlc = hlrc_utterance(base)
117
    hlc.trigger_utterance(filename_praat, filename_wav, 1)
118
119
if __name__ == '__main__':
120
    main()