giannaras80 Δημοσ. 22 Απριλίου 2010 Δημοσ. 22 Απριλίου 2010 Καλησπέρα παιδιά, λοιπόν έχουμε μια εργασία και θέλουμε να φτιάξουμε ένα πρόγραμμα σε C++ το οποίο θα προσομοιώνει ένα αυτόματο τηλεφωνητή. Όπως είναι για παράδειγμα το 1252 της Vodafone που παίρνεις για να μάθεις το υπόλοιπο ή να ανανεώσεις την κάρτα σου. Έχω βρει λοιπόν αυτόν τον κώδικα: // speak2.cpp : Defines the entry point for the console application. // #include <stdafx.h> #include <sapi.h> int main(int argc, char* argv[]) { ISpVoice * pVoice = NULL; if (FAILED(::CoInitialize(NULL))) return FALSE; HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); if( SUCCEEDED( hr ) ) { hr = pVoice->Speak(L"Hello", 0, NULL); pVoice->Release(); pVoice = NULL; } ::CoUninitialize(); return TRUE; } το πρόβλημα λοιπόν είναι το πως θα μετατρέψουμε αυτόν τον κώδικα, ώστε να μιλάει ελληνικά. Καμιά ιδέα?
Directx Δημοσ. 22 Απριλίου 2010 Δημοσ. 22 Απριλίου 2010 Αν η μηχανή δεν υποστηρίζει απευθείας εκφώνηση ελληνικών phonements (φώνημα) τότε θα πρέπει να χρησιμοποιήσετε τα Αγγλικά προσαρμοσμένα ώστε τα φωνήματα τους να προσομοιάζουν την εκφορά των ελληνικών. Για παράδειγμα αν θέλουμε να πούμε στο SAPI με την φωνή του SAM (default) να εκφωνήσει την λέξη «Καλησπέρα» μπορούμε να το κάνουμε με διάφορους τρόπους, από λιγότερο ως περισσότερο επιτυχημένους προσέχοντας τον τρόπο που γράφουμε την ελληνική λέξη στα αγγλικά φωνήματα, για παράδειγμα: Kalhspera – Δεν θα ακουστεί σωστά διότι τα φωνήματα των (lh) αγγλικών δεν είναι ομόηχα του ελληνικού «λη». Kalispera – Το ίδιο θα συμβεί και εδώ (μπορεί να ακουστεί ίσως ελάχιστα καλύτερα από την πρώτη εκδοχή) αφού ούτε το αγγλικό “li” εκφέρεται ομόηχα του ελληνικού. Kaleispera – Αν αντικαταστήσουμε το “lh” ή “li” με «le» η εκφώνηση ομοιάζει πολύ περισσότερο με το ελληνικό φώνημα «λη», όμως ακόμα η λέξη μας ακούγεται κοφτά. Kaleispeera – Αν προσθέσουμε ένα ακόμα e στο “pera” φώνημα η εκφορά θα είναι λιγότερο κοφτή και πιο πειστική. Με αυτά τα τρικ πάνω στην εκφορά των αγγλικών φωνημάτων μπορείς να βελτιώσεις ως έναν βαθμό την εκφώνηση ελληνικών κειμένων από το SAPI. Από την άλλη πλευρά μπορείς να δεις μηχανές που υποστηρίζουν ελληνικά φωνήματα όπως για παράδειγμα η MBROLA (http://tcts.fpms.ac.be/synthesis/) οπότε η ποιότητα της εκφώνησης αναβαθμίζεται σημαντικά. Καλή συνέχεια. Υ.Γ. Η Vodafone και οι υπόλοιπες εταιρίες χρησιμοποιούν μαγνητοφωνημένες οδηγίες τις οποίες αναπαράγει απλά την κατάλληλη στιγμή (και σε κατάλληλη σειρά -πχ. υπόλοιπο διαθέσιμου χρόνου κτλ) ο υπολογιστής.
giannaras80 Δημοσ. 22 Απριλίου 2010 Μέλος Δημοσ. 22 Απριλίου 2010 Και πως θα βάλουμε τα φωνήματα μέσα στο πρόγραμμα? Αν ξέρεις τον τρόπο με άλλη γλώσσα εκτός από C μπορείς να μου πεις?
Directx Δημοσ. 22 Απριλίου 2010 Δημοσ. 22 Απριλίου 2010 Καταρχήν, το πρόγραμμα που έχεις ήδη δημοσιεύσει περνάει κανονικά στο Visual Studio 2008 οπότε είναι μια καλή βάση για να ξεκινήσεις. Από εκεί και πέρα όταν λες πως θα βάλεις τα φωνήματα σε αυτό αν εννοείς πως θα γράψεις το προς εκφώνηση κείμενο (string) πολύ απλά αντικαθιστώντας το περιεχόμενο του L”Hello” με εκείνο που επιθυμείς (πχ. L” Kaleispeera”). Αν από την άλλη πλευρά θέλεις να κατασκευάσεις δικά σου ηχητικά φωνήματα δίχως την χρήση κάποιας έτοιμης μηχανής (όπως είναι το SAPI που χρησιμοποιεί ο κώδικας που ανάρτησες ή η MBROLA) τότε δεν μπορώ να σε βοηθήσω διότι το θέμα είναι εξαιρετικά πολύπλοκο αφού θα πρέπει να ηχογραφήσεις και ύστερα να τροποποιείς με συγκεκριμένους γραμματικούς και συντακτικούς κανόνες τον ήχο που θες να εκφέρεις. Αλλά δεν νομίζω ότι θες κάτι τέτοιο. Τώρα πέρα από C, χμ.. θα μπορούσες να δεις για παράδειγμα την VB (ή κάποια άλλη γλώσσα) αλλά θα πρέπει να μάθεις πως μπορείς να χρησιμοποιήσεις το SAPI/COM σε αυτήν.
giannaras80 Δημοσ. 22 Απριλίου 2010 Μέλος Δημοσ. 22 Απριλίου 2010 Φίλε μου απλά θέλω να τα γράφω ελληνικά και να τα μιλάει ελληνικά, όχι greeklish με κόλπα. Νομίζω πως υπάρχουν έτοιμα με τα ελληνικά δε χρειάζεται να τα ηχογραφήσω εγώ.
Directx Δημοσ. 22 Απριλίου 2010 Δημοσ. 22 Απριλίου 2010 Φίλε μου απλά θέλω να τα γράφω ελληνικά και να τα μιλάει ελληνικά, όχι greeklish με κόλπα. Νομίζω πως υπάρχουν έτοιμα με τα ελληνικά δε χρειάζεται να τα ηχογραφήσω εγώ. Όπως σου έγραψα ήδη, δες προς MBROLA που έχει έτοιμα ελληνικά φωνήματα (τα μιλάει ελληνικά δηλαδή!), τώρα αν μπορεί να εκφωνήσει απευθείας ελληνικούς χαρακτήρες (να τα γράφεις και ελληνικά δηλαδή) δεν το θυμάμαι πια (νομίζω ότι και εκεί χρησιμοποιείς λατινική "φωνητική γραφή" - μπορεί να κάνω λάθος και να δέχεται πια κατευθείαν ελληνικά). Ψάξε το, ποτέ δεν ξέρεις. Καλή τύχη!
gtroza Δημοσ. 23 Απριλίου 2010 Δημοσ. 23 Απριλίου 2010 ευχαριστούμε Directx πολύ χρήσιμη η βοήθειά σου .
giannaras80 Δημοσ. 23 Απριλίου 2010 Μέλος Δημοσ. 23 Απριλίου 2010 Ξέρετε πως ακριβώς θα χρησιμοποιήσουμε αυτό, ώστε το πρόγραμμα που θα φτιάξουμε να λειτουργεί κανονικά και σε υπολογιστές που δεν έχουν τον Δημοσθένη εγκατεστημένο;
gtroza Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 http://en.wikipedia.org/wiki/Speech_synthesis http://msdn.microsoft.com/en-us/library/ms720163(VS.85).aspx Step 3: Setting up voices Once COM is running, the next step is to create the voice. A voice is simply a COM object. Additionally, SAPI uses intelligent defaults. During initialization of the object, SAPI assigns most values automatically so that the object may be used immediately afterward. This represents an important improvement from earlier versions. The defaults are retrieved from Speech properties in Control Panel and include such information as the voice (if more than one is available on your system), and the language (English, Japanese, etc.). While some defaults are obvious, others are not (speaking rate, pitch, etc.). Nevertheless, all defaults may be changed either programmatically or in Speech properties in Control Panel. Setting the pVoice pointer to NULL is not required but is useful for checking errors; this ensures an invalid pointer is not reused, or as a reminder that the pointer has already been allocated or deallocated #include <stdafx.h> #include <sapi.h> int main(int argc, char* argv[]) { ISpVoice * pVoice = NULL; if (FAILED(::CoInitialize(NULL))) return FALSE; HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice;); if( SUCCEEDED( hr ) ) { pVoice->Release(); pVoice = NULL; } ::CoUninitialize(); return TRUE; } Ξέρετε πως ακριβώς θα χρησιμοποιήσουμε αυτό, ώστε το πρόγραμμα που θα φτιάξουμε να λειτουργεί κανονικά και σε υπολογιστές που δεν έχουν τον Δημοσθένη εγκατεστημένο; το Hello World, ακούγεται ; έχετε ψάξει το θέμα ; .
giannaras80 Δημοσ. 25 Απριλίου 2010 Μέλος Δημοσ. 25 Απριλίου 2010 Θέλω να φτιάξω πρόγραμμα με ελληνικά, όχι αγγλικά ή κινέζικα
gtroza Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 αυτό που βρήκες το έτρεξες ; το Hello World, ακούγεται ; .
giannaras80 Δημοσ. 25 Απριλίου 2010 Μέλος Δημοσ. 25 Απριλίου 2010 Ναι αυτό που έχω γράψει στην αρχή παίζει κανονικά τα αγγλικά. Ψάχνω όμως για ελληνικά, αν γράψω ελληνικά σε αυτό λέει άλλα κι άλλα
gtroza Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 τα greeklish,όπως υπεδειξε ο Directx δουλεύουν ; θα μπορούσες να "μεταφράζεις" τα ελληνικά σε greeklish δεν υπάρχει κάποιο αρχείο στο οποίο να δηλώνεις τη γλώσσα και άλλα στοιχεία ; υπάρχουν και άλλες προσεγγίσεις στο θέμα απ' ότι είδα μπορείς να απαντάς με σύνθεση έτοιμων λέξεων ή και προτάσεων τι ζητάει η άσκησή σας; δεν είμαι του "χώρου" .
giannaras80 Δημοσ. 25 Απριλίου 2010 Μέλος Δημοσ. 25 Απριλίου 2010 Δεν δουλεύουν τα greeklish. Αν υπάρχει αρχείο δεν ξέρω αλλά ψάχνω
gtroza Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 καλή επιτυχία ! ελληνικά σε αυτό λέει άλλα κι άλλα σε ίδια αντιστοιχία - ελληνικά=άλλα κι άλλα πάντα ; .
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.