Also zum Mitschreiben. Dir wird die Variante mit ncurses zu kompliziert? Obwohl du mit ncourses eigentlich nichts zu tun hast und es in der Struktur in Main eigentlich sehr klar zu sehen ist was wie wo passiert? Ich meine, da sind die ganzen case Aufrufe. Diese rufen sehr einfach die Funktionen auf die für die Spracherkennung benötigt werden. Da ist nicht viel Schnick schnack drum rum und das kann man dann auch ziemlich einfach in jede andere Menüstruktur ganz nach Belieben einbauen. Das hat weder was mit Linux-Programmierung noch sonst etwas zu und da ncurses meines Wissens nach auch auf WIndows verfügbar ist wäre sogar eine Portierung kein wirkliches Problem, aber wie gesagt, wie am Ende das Menü aussieht, ob man es ganz minimalistisch über eine Eingabeaufforderung oder bis hin zu einem aufgeblasenen QT oder Windows Fenster haben will ändert nichts an den eigentlichen Funktionen.

Code:
		switch(menuRet)
		{
			case 0:
			
				datei.open(_datei, ios::in);
				
				if(datei)
				{
					for(i=0;i<SHRT_MAX;++i)
					{
						datei >> waveBuffer[i];
					}
					
					datei.close();
				
					_speicher = "Wave vorhanden";
					_status = "gesichert";
				}
				else _fehler = "Datei konnte nicht geöffnet werden!";
				
				break;

			case 1:
			
				audioCapture(waveBuffer, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
				
				_speicher = "Wave vorhanden";
				_status = "ungesichert";
				_datei = "";
				
				break;
			
			case 2:
			
				datei.open(_datei, ios::in);
				
				if(datei)
				{
					for(i=0;i<SHRT_MAX;++i)
					{
						datei >> waveTemp[i];
					}
					
					datei.close();
					
					_fehler = "Datei " + _datei + " wurde abgespielt!";
					
					_datei = ""; 
				
					playCaptured(waveTemp, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
				}
				else _fehler = "Datei konnte nicht geöffnet werden!";
				
				break;

			case 3:

				playCaptured(waveBuffer, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
	
				break;
				
			case 4:
				
				optimieren(waveBuffer, SHRT_MAX);
				
				_fehler = "Speicher optimiert!";

				_speicher = "Wave optimiert";
				_status = "ungesichert";
				_datei = "";
				
				break;
			
			case 5:	
					
				plotArray(waveBuffer, SHRT_MAX, 0);
				
				break;

			case 6:
			
				dateiEndung = ".hhw";

				dateiName = _datei + dateiEndung;
				
				datei.open(dateiName, ios::out);
		
				if(datei)
				{
					for(i=0;i<SHRT_MAX;++i)
					{
						datei << waveBuffer[i] << endl;
					}
					
					datei.close();

					_status = "gesichert";
				}
				else _fehler = "Die Datei konnte nicht geöffnet werden!";
				break;
				
			case -1:
			
				return 1;
				
				break;
				
			case -2:
				
				_fehler = "Der Speicher ist leer! Erst laden oder aufnehmen!";
				
				break;
		}
Genau das hier ist das Einzige was für die Spracherkennung dann irgendwie relevant ist. Ich denke das sollte man in jede für sich bevorzugte Variante umstricken können. Denn wo nun menuRet seinen Wert her bekommt ist ja eigentlich völlig egal, ob es nun über Zenity, den Terminal oder irgendein Fenster geschieht.

Du willst kein OpenCV benutzen, okay damit kann ich leben. Wäre eine (portable) Möglichkeit gewesen das etwas bequemer zu haben. Aber gut, muss ja nicht.