Я пытаюсь написать программу, которая поможет читать текстовые и pdf документы на C, используя программы с открытым исходным кодом на Raspberry Pi.

программа простая, ничего сложного .....

Я подключаюсь к Raspberry Pi через SSH с моего ноутбука ...Переадресация X работает нормально, потому что я могу запускать приложения X из командной строки без каких-либо проблем.

Я использую apache2 на Raspberry Pi, и я сделал пользовательский интерфейс для этой программы, где вы можете вставлять текст, загружать текстовые файлы или PDF-файлы.

Текст преобразуется в речь с помощью espeak, который сохраняет выходные данные в волновой файл.

Теперь проблема в том, что я использую:

system("xmms2 play file.wav &") в коде C ........ просто краткое описание

он компилируется ..... когда я пробую его с веб-страницы, он отображает ошибки:

Gtk-WARNING **: cannot open display: localhost:10.0
cannot start xmms2d.....failed to start xmms2 server

я даже попробовал другой аудиоплеер под названием aqualung, и он работал один раз, но на следующий день, когда я перезагружаю компьютер, он больше не работает.

Я гуглил и сделал все, начиная с export DISPLAY=:0.0 чтобы убедиться, что имя хоста на клиенте и хосте не localhost, но безуспешно

Поэтому я думаю, что, может быть, есть что-то, чего я не добавил в программу C, возможно, файл заголовка, который нужно добавить, или что-то в этом роде .....Gtk+ установлен на моей малины ....

Или, может быть, я не должен делать это как программу на C, но делать все в Bash или PHP ....

если я использую aplay для воспроизведения wav-файла, я получаю вывод звука, единственная разница в том, что мне нужно что-то с командной строкой и пользовательским интерфейсом. поэтому я могу отправлять команды из программы, а также пользователь может приостанавливать и воспроизводить файл в любое время.

Просьба некоторый совет нужен .... вот код

#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <wiringPi.h>   


char readcmd(void) //reading from text file /home/pi/cmdrdy.txt first character is read
{    //whenever text is received a 1 is written to this file, 2 for file received
    FILE *stream;
    int ch;
    if( (stream = fopen("/home/pi/txtrdy.txt", "r")) == NULL )
        return 0;
    ch = fgetc( stream );
    fclose( stream );
    return (ch-'0');
}


void  reset()
{
    FILE *ft;
    char ch;
    ft = fopen( "/home/pi/cmdrdy.txt", "w" );
    ch = '0';
    fprintf(ft, "%c", ch );
    fclose(ft);
}


void checktxt(){
    if(readcmd() == 1)
    {
        system("espeak -v en -f /home/pi/book.txt -w /home/pi/text.wav &");
        reset();  //to reset the text received flag to 0
        system("xmms2 play /home/pi/text.wav &");
    }

    if(readcmd2() == 2)
    {
        system("pdftotext -layout  /home/pi/upload/*.pdf  /home/pi/converted.txt &");
        delay(300);
        system("espeak -v en -f /home/pi/converted.txt -w /home/pi/book.wav &");
        delay(500);

        system("sudo rm /home/pi/converted.txt");
        system("sudo rm  /home/pi/upload/*.pdf");
        system("xmm2 play /home/pi/book.wav &");
    }
}

void main(){
    while(1){
        checktxt();
    }
}

2 ответа2

4

Я сам не сталкивался с этой проблемой, но могу рискнуть сформировать обоснованное предположение о том, почему это происходит: на первый взгляд кажется, что xauth не распространяется на дочерний процесс. На самом деле, я не смог найти XAUTHORITY в выводе

   export -p

на малину работает Raspian.

Я не смог с уверенностью установить с помощью Googling, что это действительно так даже для других ОС, но попробовать и исправить это так легко, что в любом случае стоит попробовать. Я предлагаю вам заменить команду исполняемым скриптом, назовите его /home /my_name /bin /my_script, сделанным исполняемым с помощью chmod 755 , в который вы помещаете следующие 3 строки кода:

   #!/bin/bash
   export XAUTHORITY=/home/my_name/.Xauthority
   xmms2 play file.wav &

Поскольку system вызов сначала разветвляется, а затем запускает экземпляр оболочки с переменными среды вызывающей стороны, ваша программа знает (и доказывает, что знает), что ваш дисплей равен 10.0 , но доступ к нему должен быть предоставлен в рамках подоболочки, в которой команда xmms2 выполнен. Эта модификация гарантирует вам это.

0

Я немного изменил приведенный выше код и добавил в него совет

включают

включают

включают

включают

typedef enum {WAIT, TEXT, PDF, DOC} STATES; typedef char STATE; СОСТОЯНИЕ current_state;

char readcmd() // чтение из текстового файла /home/pi/cmdrdy.txt первый символ читается {FILE * stream; int ch; if((stream = fopen("/ home / pi / cmdrdy.txt", "r")) == NULL) return 0; ch = fgetc(поток); fclose(поток); возврат (ch-'0 '); }

void  reset()

{FILE * ft; char ch; ft = fopen("/home/pi/cmdrdy.txt", "w"); ch = '0'; fprintf(футы, "% c", ch); fclose(футы); }

char convtts() {  //convert text to speech
system("espeak -v en -f /home/pi/book.txt -w /home/pi/text.wav &");
return (0);

}

char pdf2txt(){   //convert pdf to text
 system("pdftotext -layout  /usr/lib/cgi-bin/upload/*.pdf /home/pi/converted.txt");
return (0);

}

char pdftts(){ //convert converted text to speech
  system("espeak -v en -f /home/pi/converted.txt -w /home/pi/book.wav &");
return(0);

}

void state_machine(void){   //creating a state machine

switch(current_state){


case WAIT:


    if(readcmd() == 1)
    {
    reset();
current_state  =  TEXT;
    }

if(readcmd() == 2)
    {
 reset();
    current_state  =  PDF;
}
break;


case TEXT:

convtts();
while(convtts()==1);

system("/home/pi/bin/text_script");

current_state = WAIT;
break;


case PDF:

pdf2txt();
while(pdf2txt()==1);

pdftts();
while(pdftts()==1);
system("/home/pi/bin/book_script");
system("sudo rm /usr/lib/cgi-bin/upload/*.pdf");
current_state = WAIT;
break;

}}

void main(){

while(1){

state_machine();

}}

И это работает как шарм ...... спасибо миллион

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .