In this episode, our guest is Andrei Petreanu Tech - Lead, Machine - Learning, Research - Engineer and lecturer at the Polytechnic University of Bucharest. We will talk about his latest project, a voice-based virtual assistant in the not-so-widely-spread Romanian language,
Listen to the podcast:
Mihai: Hello and welcome to a new episode of the Cegeka podcast; I’m Mihai Popa. We have short discussions with people connected to the IT world on technology topics.
Today our guest is Andi Petreanu, who is a tech lead with Cegeka Romania’s artificial intelligence team and lecturer at the Polytechnic University of Bucharest, on artificial intelligence and machine learning topics.
We will be talking about his latest project, a voice-based virtual assistant in the not-so-widely-spread Romanian language, which can save a great deal on call-center costs but can also evolve to much more.
So, Andi, welcome.
Andi: Hello and thank you, thank you for having me.
Mihai: Right so, could you let us in on the nature of this project? Just what is it about?
Andi: We've been trying to keep up with the latest trends in machine learning and we've been doing a really good job of that. In computer vision, I'd say we've got a lot of results in lots of projects. But last year, well, 2018, 2019, to be more exact, has been an amazing year for natural language processing, natural language understanding, and the technologies, and architectures developing this kind of a spectre of the technology of machine learning.
We've stumbled upon an initial client who wanted to do things better than they already had, with basically classic chatbots or chatbots systems that existed previously.
And we went into it head-on, we had no expectations. We didn't know what we were going to find, and what we did find is an enormous amount of new technology emerging on this side of natural language understanding with lots of headlines and lots of improvements by companies such as Google or Open AI or even Envidia and Facebook.
So basically we are addressing a need in the market for cheaper customer service, cheaper customer care and we want to do it as naturally, and as flowing as possible with an assistant that can interact with you in a conversation and guide you on your way to what you're looking for. So the nature of the project is this natural language understanding, with a transformer model - transform own neural networks.
Mihai: I don't think there is a necessarily a pre-existing library on the Romanian language that you were able to use, is there?
Andi: No, no, there isn't. And there are lots of languages that don't have language models developed for them - with the transformer architecture.
What the people at Google - because they're the main driver of this innovation in this sector - have done, is that they basically produced a new architecture, new research, and they only trained models on English and Chinese. Those being the most important markets.
So, for the rest of the world, we kind of had to catch up and try to do it ourselves using like the hints and the insights that they gave us. For every other language out there, you have to do it yourself. You have to know what you're doing and implement this transformer model.
We had quite a hard time finding the dataset. It needs to have a very comprehensive, very large data set of texts to train on. And we used Romanian Wikipedia and another couple of sources; but the Romanian Wikipedia is much smaller than the English Wikipedia, for example.
Mihai: You need to train your assistant before it can understand and produce, generate, speech?
Andi: Yes. So they're also a couple of layers of abstraction here.
First, you need to train a language model. What that means is you're going to have on your network that understands the context of your language and the context of words in a sentence, for example.
And then you're going to fine-tune that network to understand a specific vertical of a customer or, a client's; like you want to do telecom, you want to do banking, you want to do travel, you're going to have to fine-tune on those particular verticals with their content.
And when you want to transition from text understanding and text responses to speech, you were mentioning something about vocal that's an entirely different neural network called the Tacotron. We're using the Tacotron 2 right now and it's a neural network that inputs text and outputs.
Mihai: Okay I'm going to go back just a little bit. How did you even go about that? I mean, did you just pass every single page in Wikipedia and tried to make sense of it?
Andi: Yeah, so we found online some type of a crawler was specifically designed for Wikipedia that would strip away all the unnecessary metadata and figure all that is not a text. And we’ve used this - well this a free resource that you can use to do this. We’ve used this to extract only the text of Wikipedia and then we [applied it during] training time for the language model. We’ve just fed it random sentences from the data sets that we have.
We’ve also used subtitles for movies and some type of reviews in some Reddit pages. We’ve used several other resources too. We found a couple of novels like a book corpus stuff. We used that, too, and it got pretty big at one point.
Mihai: Right, so, as far as I know, there are several training methods that you can employ, such as supervised training or self-training so forth, which ones did you employ?
Andi: For the first task, which is training the language model to understand the context of your utterance, let's say, we used a self-supervised method, which consists of randomly masking words in a sentence. And then we taught the neural network to predict what the randomly masked words were. And this is a self-supervised learning method, is self-trained because there is no crown truth, there's no annotation process. You just take a random sentence out of the data set corpus, and then you randomly mask out 15% of the words, ask the network to produce the missing words.
Mihai: Sort of filling-in the blanks?
Andi: Yeah basically fill-in the blanks. Like if you’d say, you know, “I want to go to [missing word]”, or let's say “The theory of relativity was invented by [missing word]”, and then the network has to produce something that works there, and it's gonna say, “Einstein”. And that, that's pretty amazing. The fact that at the end of this training process, the network contains a type of, a squishy model of the knowledge of the world. So, if, for example, I'd say anything related to Ceausescu in the Romanian context, the network will probably complete the sentence and say that Ceausescu was a president or that Ceausescu is now dead, which are all true, and it's pretty impressive because it's not just contextual information, it's also knowledgeable information.
Mihai: Indeed, indeed, so right now, the virtual assistant that you have worked on is generic. How do you go about implementing it for a specific industry? If I have, I dunno, a shoe store or something like that, how do you go about actually making it relevant for the specific vertical and context that particular business is in?
Andi: Yes; so, basically, at this point, after you self-supervised, trained this type of a model, you're going to have a language model that understands the context of your language and this squishing formation of your context. But you can't redo much of anything with this other than, you know, complete fill in the blanks, for sentences. And that's not useful for industries or businesses, but what you can do is you can try to fine-tune that network to produce a user intense or entities dynamic entities inside of sentences. Or you can do sentiment analysis and, all of the types of downstream tasks. And this will work fantastically well if the pre-trained model starts with a language model trained in your language. So when a customer or when a new client comes to us to implement some type of natural language understanding technology for them, we ask him for data.
We need conversational data that they use with their customers. We need emails, we need messages all anonymized so that they're GDPR compliant. And then we annotate this data. This is no longer a self-supervised training process. It's a supervised now, the human supervises the process. We annotate this data with the intensity of each utterance and the entities of each utterance. And then we asked the network to learn about intense and entities and sentiment analysis. So, that's a whole different process that we go through. It's like the second step is educating the language model to become proficient for your industry or vertical.
Mihai: Right, makes sense, and, let's say that I'm in a completely new industry, I mean a service industry of a particular vertical. How many messages would you need to parse or analyze or annotate to be able to train the assistant in this particular vertical?
Andi: Well, it's amazing what technology has come up to; the fact that you already have a pre-trained language model that understands your language and context means that in the second step [means] you don't have to train it for so long or with so many data points. So for example, we had a demo for an insurance company the other week and they gave us like a pretty easy flow of doing some policies over some insurances and we had about 100 lines of conversation. , and we augmented those 100 lines of conversation in different ways and ended up with about 500 lines of conversation. And then we trained on those 500 lines, and it was pretty good already. So obviously more data results in better generalization, better accuracy, better performance. But we did it with 100 lines from the client.
Mihai: That's amazing because I know, I remember from the computer vision projects that we've had that we needed thousands upon thousands of images, to make sense of…
Andi: Yeah, but, but this only happens because of the pre-training, the initial pre-training of the language model that probably takes up to something like a billion lines of conversation so.
Andi: So, so that's, that's the volume right there, you need to pre-train it on a very large corpus of data and then the fine-tuning can be done like an on a smaller, much, much smaller a dataset.
Mihai: Understood. Okay, so did you have a particular set of pre-existing technologies that you based this assistant on?
Andi: So we were looking a lot at what the competition is doing. You need to have like a healthy status report of what's happening and, the best thing that's out there right now - but not in all the languages of the world - is Dialogue Flow from Google. So I'm not ashamed to say this. That's the best product.
And we try to guide our implementation to at least match that product. Obviously, that product, as I said, is not present in all the languages. And they don't offer you any type of support for the state machine or to graph part of the whole product. So what they do offer is just an understanding module for English and Chinese. So yeah, that was the most influential technology that, that we looked at.
Mihai: Okay, but if Google comes up with such a product - and they have accurate speech recognition engines and of course very powerful natural language generation engines - should anyone assume that this project is just an interface built on top of Google's product?
Andi: So that, that question kind of has two or three parts to it:
So, first of all, the natural language generation itself is an, is still an open research topic. And that is because if you ask the neural network to generate a response for a very short response, it might make sense. It might do a good job of it, but for longer explanations or for very particular details that it needs to offer, it kind of wanders off, and kind of produces a contextually relevant result, but a little bit maybe out of industry scope. So, for example, you can make it write amazing stories about unicorns and it will wander off and tell you an amazing story about a unicorn. But if you wanted it to give you a resume on what the product of a bank is, you're not gonna allow it to wander off you. You cannot do that, so you cannot do natural language generation at this point, so I think that was one of the questions.
The other question probably is if we implement anything that Google already has, and the answer is no. We did all the implementation of our product ourselves.
We run our neural network, with our customized outputs, with our customized structure, so the intellectual property is ours right now. And, reading the documentation companies like Google put online, it seems to me that they don't care about producing language models for all the languages in the world. They care about empowering other companies, and other people like myself to do it for their language. And I think that that's a good way to look at it in kind of an open-source environment.
Mihai: Have you seen examples of such less frequently-used languages implemented on top of Google's product so far other than Romania?
Andi: Well again, we don't implement it on top of Google products, so it's our own.
Mihai: Sorry, sorry my bad.
Andi: It’s no problem, it's our implementation, it's not on top of a Google product. It's Google inspired if you would, out of the research and the code that they put up; we wanted to make a product as least as good as theirs. So it's inspired by that, but it's our own thing. And yes, we did the first Romanian language model and while we were doing it, I was in contact with the guys who were doing the first German-language model.
And it was a pretty interesting conversation that I was having with those guys because they were bumping into the same problems and issues that I was having. And because the technology's new, I mean, these transformer models like Bert or Albert or Roberta, all of these technologies came up in 2019. So, because they're so new, there were probably lots of research centers around the world trying to do the same thing at the same time. So I was lucky enough, to be in contact with the German guys who were doing the German first language model. And we did the first Romanian one.
Mihai: Right. So, because you mentioned Bert, Robert, and Alberta just for anyone who's listening and might not know too much about that, would you care to just give us a description?
Andi: Sure, so sorry about that, so the underlining technology or neural network architecture is called the transformer. And that's the new thing. The new kid on the hot block. I'm not gonna go into the details about what that means. Somebody who's listening to this podcast can look it up on the net. But what a Bert is, it’s a bi-directional encoder representation for a transformer. So I know there are a lot of words over there, but it suggests that the flow of information inside of the neural network brain is bi-directional. And it uses a transformer that has attention models. This attention model idea is very important and there was a kind of a stroke of genius that I wouldn't credit to anybody in particular. I don't know who had that first, there are versions of the attention models in the computer vision world.
Also, what an attention model is, is the network doesn't give as much attention to all the words in the sentence so.
Mihai: It provides weight to each of them, right?
Andi: Yeah basically it weights some of the words in a sentence as being more important for your outcome or your output than other words in a sentence. So for example, if you say, I don’t know, I can come up with lots of examples in Romanian but not in English right now. Let’s take the fact that you stand on top of a bench for example; well the “on top” bit is very important for the intention model to understand what it is that you are doing. And it's also very important to the word “bench” because you're standing on top of the bench. So that type of mechanism of attention has been really interesting.
Mihai: Yeah. And then I think that there's something that even Google hasn't sorted out yet, which is the use of commas. I'm sometimes writing emails on my phone through voice to text. And it can never understand when I'm putting in a comma or when I'm putting in a period, let alone putting in a column, it can never do that.
Andi: Yeah I guess that's a little bit understandable, in a sense when you as a human are using a coma in a textual representation of what you're saying, you kind of want to emphasize some grammatical rule or some dramatic pause in your speech. But then, when you speak and you expect the machine to write the text for you, the dramatic pauses that you make are going to be very different from, you know, one person to another. So, it could have quite a hard time to understand your style of pausing and your style of accentuating.
Mihai: Do you see this being solved anytime soon? The comma problem?
Andi: It probably will be, I don't think it's of importance to solve the comma problem right now. I think there are lots of other important kinds of wrinkles to get out of the way a little bit more than that.
Mihai: What would you be thinking of?
Andi: I know there's research right now happening in the direction of an end-to-end model. The architecture that I was describing to you is comprised of about three or four neural networks.
There's a neural network that does a speech to text.
And then when you have the text, you do the natural language understanding neural networks that do the second one.
And then you have a formulated output, a textual output, and out of the textual output, you do a spectrogram representation of what that text should look like in spectrogram form. And this is the third network.
And the fourth network takes the spectral grammar presentation of your text and produces the audio, so there are four networks.
And these architectures work hand in hand. I know for a fact that there's lots of research going into creating basically a single input-output network that receives audio and outputs audio. And to me that's fantastic that's like a brain in itself.
So it does the understanding. It does audio filtering. It does the spectrogram all that. And it does it inside of one single neural network.
Mihai: I'm coming back to the virtual assistant you've built. It also generates active questions and active content, does it?
Andi: Yes - so that's another, you know, I mentioned earlier that the natural language generation is an open research topic. And one thing that's been happening quite a lot is that you give the assistant the intent of the user and the entities. And then you might also give it some type of metadata.
Like the user is a little bit upset or the user has an urgent tone or he's more interested in buying this or the profile of the user. And if you give it also the metadata and you ask it to generate content, it will start generating responses that are very different if it talks to you or if it talks to me.
So it will be very personalized, tailored responses. And I think that's another thing that's being research and ongoing, it's going to happen shortly.
Andi: Right now the way the network interacts with the user is that for example, you want to book a flight to Berlin, you want to go to New York; you're going to have to tell it: when do you want to leave or were from when you want to come back. How many passengers do you want to fly business? Do you want to fly economy? How much is your spending budget? Do you want a taxi waiting for you at the airport? And all of those details, some of them are must-haves and some of them can be set to default. Like by default you're going to use the economy class, let's say.
So, in a conversation with a network that wants to make a reservation for you to fly to Berlin, the network or the system already knows what it needs to complete all of those details. And if somebody who doesn't know much about traveling comes along and asks for the booking, the assistant is going to start asking them questions for it to fulfill, or the information that is required to get you to New York. I was going to ask you, when do you want to leave? Oh, where are you leaving from? How many people are there? Do you want a taxi to wait for you when you arrive? In that sense, it also asks questions and it kind of has a dialogue with you.
Mihai: This brings me to a couple of episodes of Star Trek I've watched some-times ago and I remember that always the computer voice in Star Trek, at least in The Next Generation series, sounded so robotic. So, for example, I would ask for a flight, and I would say: “I want to leave between next Tuesday and next Friday, Computer, please give me alternatives for these days”. And then the computer in Star Trek would say: “Tuesday flight, not available, Wednesday flight not available, Thursday flight, not available, etc”. How do you avoid the robot sounding too robotic and being closer to natural speech?
Andi: This is one of the amazing bits that I was awestruck with when I came across it. I was used to lots of chatbots or robot assistance for telecom companies that would have the robotic voice or ask you to press dial the number five to get to a certain menu template. And I was pretty sick of that and I thought that that's not, that's not a good way to have a conversation is not a good way to entertain a relationship with your client.
Mihai: Indeed, indeed.
Andi: Yeah. So, we were looking at how to transform the textual messages that the natural language understanding would eventually produce into vocal responses. And as I mentioned in the architecture, there is also a neural network that does the interpretation of those spectrograms into audio. And what we did is that we found audiobooks for stories, basically stories for kids. Like popular folklore stories for kids in Romanian. And we found those stories and there was this particular character that we found about you know six to eight hours of audio from, and we also had the textual transcript from the audio. So that's quite a lot of audio, eight hours of text and written in stories and you could say, that's a lot too much…
Mihai: …To munch through.
Andi: Yeah but, but actually the big, big products probably use 100 hours of audio. And we’ve tried to train our model or wave wavelength model on this audio - eight hours of stories for kids. And the result is impressive. It talks with the same intonation as the narrator did within the stories. It also has a little bit of a Moldovian accent.
Andi: The speaker was a little bit Moldovian and so the assistant kind of picked up on those inflections and tones of voice. And it's a more or less just a copy of the speaker we found audiobooks from, and you can get it to say anything. It's pretty wild to think that, with 10 hours of audio from something like Morgan Freeman or 10 hours of audio from Trump, you could do a deep fake that could say anything with the voice of Trump or with the voice of Morgan Freeman. But that's the state of technology right now.
Mihai: So, that means that the assistant at hand right now can adopt different voices if needed?
Andi: Whenever I meet a new potential customer I'll usually extend to them the idea that their voice or the customer care voice that they have is very important to their personality and their image, to their relationship, an image that the clients form in their heads about that company. My recommendation for every one of these companies is that they hire an actor. Somebody whose voice they consider to be sexy.
Andi: And then, they record about 10 hours of audio in their particular contexts - maybe travel or banking or whatever. Just make that actor talk 10 hours about that thing and give us the audio and the transcript, the textual transcript of what he's talking about. And they're going to have an agent with that actor's voice.
Mihai: Indeed, because if I'm Vodafone and I buy this agent, I don't want it to sound like the same agent employed by Orange.
Andi: You want it to have your own Vodafone voice, you want to give it a name. In the future, like five to 10 years, you'll be talking to somebody at Vodafone with a name and a personality and all those characteristics that a human has and needs to be, insightful and empathic and all that.
Mihai: Does the assistant learn from individual users? It’s supposed to start learning at one point from individual users as to their particular talking patterns or idiosyncrasies if you will.
Andi: This is an area of machine-learning that the big people in the industry, like Andrej Karpathy or some other people like that, they probably call it active learning. And what active learning means is that the neuro network gets better and better, it interacts with its user, but there's a false conception of the fact that the network, the neural network or the system learns real-time during the conversation it has with the user.
That's not the case, or at least not right now. More or less the case is that if the agent doesn't understand what the user is saying, it’s going to say “I don’t understand”. For example, if the user wants to talk to a travel agent and he tells the travel agent that he wants him to buy some groceries, the travel agent is going to say “I don't understand. Could you please, reformulate or tell it to me in another way. Maybe I can understand that way.” And if it does that, then we can capture that event when the neural network did not understand what the user was saying. And then let's say once a month or once a week, depending on the client's requirements, we can retrain the model on the utterances that it did not understand. So we… make it better. But it's not real-time. The network doesn't learn by talking to you in real-time. It learns by talking to me, the engineer, once a week.
Mihai: Okay, so maybe you could switch it to the grocery agent in case that is the context?
Andi: Yeah, definitely so I envision lots of this kind of narrow, narrow knowledge agent. You are going to have an agent for your grocery lists, an agent for your travel, an agent for your insurance, an agent for your telecom company, whatever. But at some point, these agents are probably going to converge.
Andi: And it's probably going to be some type of meta agent that understands more and more context about the world around it. And that, that's the point when it's going to get a little bit scary. I'm expecting them to be therapeutic agents and, basically agents that talk to people that feel lonely at home.
Mihai: The fortune teller agent.
Andi: Yeah, yeah. Maybe that, maybe that the fortunes of the magic, you're going to have agents for all of this stuff, I can bet. I can bet lots of money on that, yeah.
Mihai: I was thinking about the new technology released by Google not so long ago. It's quite fresh, and it's called Tensor Flow.JS, I believe. And I was wondering how this could interfere with instant learning by any agent from the browser?
Mihai: Apparently, it makes the connections a lot faster with the server…
Andi: It might. I haven't worked with deployment on the.JS route up until this point because none of my customers asked for that. But I don't think it handles a speech-type of neural networks, because those require pretty powerful GPUs. So I don't think they can be done in a JS kind of image local container on your mobile phone.
For example, my MacBook Pro, it's running the transformer architecture without a problem on the CPU. But if I want to talk to it, if I want to talk to the actual neural network, it doesn't do the processing on its GPU or CPU because it's too light. So, it needs to go to the cloud.
Mihai: I understand so that means that for this assistant, you employed some of the types of hardware processing.
Andi: Yeah, so most of the, well if it's text-based, we've got something like seven milliseconds of answer time on a CPU. So you would imagine that on a GPU you can scale that crazily. But when it comes to voice and audio type of synthesis, those can only be done right now without having a lag in response on powerful GPUs in the cloud.
So even if you interact with the Google assistant, most of the time you have to wait a second till it responds.
Andi: And I don't think that processing is done necessarily or entirely on the phone, some of it I'm pretty sure it's done in the cloud.
Mihai: Now, as the last question I have, what are the next steps for the assistant? Where do you see it going, what are your plans?
Andi: I can see there's lots of competition in 2020; I think that's healthy; I think it's a sign that the industry is headed into that direction. I think Cegeka still has the edge.
We still manage to do it first in Romania, and we managed to do it well enough such that we get leads and customers.
I think next steps, well generally when it comes to technology, I'm very much looking forward to natural language generation, automatic generation - not just understanding and I'm looking forward to reducing costs for customer service providers by 70 to 80%.
And I promise I guarantee I can do that, and people are going crazy. They're like, I'm spending millions of dollars a year on customer service.
Mihai: I think every service company does.
Andi: Yes. And then when I come along [saying]”: “I can scratch off 70% of those dollars for only a portion of that money”, they cannot believe it. They [think] “no, this cannot be done, this is too good to be true”. Because they usually have a bad experience with the chatbots in the past, that used to do pattern matching.
Mihai: Yeah, we all know those.
Andi: [I tell them] “this is not the same technology”, and when I demo it to them, most people, don't believe that it's real. They want to demo it themselves. And then I let them play with the technology. “You do it yourself, demo it yourself”, and they're just blown away by how fast the response is, and by the ambiguities, it manages to handle.
Mihai: I think it's all about accuracy, right? Speed and accuracy?
Andi: Speed and accuracy, yes. But even with you talk to your wife, you might not fully understand everything that she's saying so.
Mihai: That's not a good example.
Andi: Hear me out on this, so even, even when you have interpersonal communication, you and your wife or you and your kids, you're not going to fully understand what they want all the time.
So the accuracy in this situation is not particularly 100%. You can't say you understand your wife 100%. Nobody understands their spouses or their husbands 100%.
So I think more than plain accuracy, we should be looking at whether or not the agent does the job it's meant for, does it guide the user through a process that leads the user to buy a ticket to go to Paris? Does it guide through a process that makes it easier for the user to understand why he paid a lot of money on his telecom bill?
So, even if it's not 100% accurate all the time, if it manages to guide you through it, I think that's a success.
Mihai: Indeed, and also with a voice assistant, you have the barrier of not perceiving the body language, which apparently by many psychologists makes up to, I don't know, 70, 75%?
Andi: Yeah so there's a lot, a lot of buzz in this area, too. Samsung has come up with a product that's called Neon.
And this is 2020 or is December 2019 or January 2020. I think we're right now, we're on the 16th of January. This is a product that came up like a week or two ago. And the Neon product from Samsung is a digital assistant, but it also has a visual representation like a body. It also has a face and gestures and all that, but if you look at the demos that they made at CS this year, you're gonna see that due to the high complexity of generating body language, facial expressions, body expressions, all that: it's kind of laggy.
So we still don't have the computing power to produce this thing on our tablet or our mobile phone. It needs to be powered by larger GPUs for it to work.
Mihai: I've seen, I've seen demos of neon and it was scary.
Andi: It's pretty scary.
Mihai: Yeah. I mean, they just looked, they looked exactly like actual persons.
Andi: Yeah, they look pretty real. I've seen demos of the fake deep face of politicians saying lots of things that they shouldn't be saying. Those demos are made by a couple of really smart guys and researchers for big companies. They want to do some kind of crazy act of rebellion in their backyard. It's amazing. Amazingly, we can do these types of things, and it's also scary.
Mihai: Do you see any application of this assistant and the feedback that it gets from users towards the behavior analysis of the users?
Andi: Definitely; but, behavior analysis of the users also refers to the actions that users make or their history or background. So there's a lot of research in the area of profiling your user, understanding what your user's personality type is, understanding when your user wants to renew his contract, the customer lifetime value side of things.
Mihai: Based on location, emotion, etc.
Andi: Yes, and all of that what an agent like this brings extra to the table is sentiment analysis. So an agent like this can understand if you're in a nervous, urgent, moment, or if you're kind of a funny light, relaxed, laid back about the subject or if you're undecided; then maybe it can tilt the balance.
Mihai: Thank you so much again, Andi, and best of luck going forward with this pretty interesting project, which is a first on the Romanian market, and for the Romanian language, not only for Romanian market; because we have about, I don't know, 4 million [Romanian] people living abroad, so it might get a bit of traction abroad, as well. And I do hope that this will evolve into much more.
Andi: Thank you very much for having me. It's been a pleasure and, and I'm pretty confident we don't need luck. We're gonna kick it out of the ballpark.
Mihai: Right on, thanks a lot. This is Mihai Popa, from Cegeka Romania, signing out. All the best.