hlrc / client / python / hlrc_client / hlrc_speak_utterance.py @ 62d50515
History | View | Annotate | Download (4.192 KB)
1 |
#!/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() |